diff options
| author | John Baldwin <jhb@FreeBSD.org> | 2002-08-01 13:39:33 +0000 |
|---|---|---|
| committer | John Baldwin <jhb@FreeBSD.org> | 2002-08-01 13:39:33 +0000 |
| commit | 0711ca46c58ba94440d132d7e00d8d310f84dc42 (patch) | |
| tree | a5e4b1ed84fa456d9208886efec681de6de63ddc | |
| parent | c0d9b7f2500256b03a53125800452c9324d257c1 (diff) | |
Notes
| -rw-r--r-- | sys/kern/kern_shutdown.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c index ec740ec4ee5b..13a9c7aa26a5 100644 --- a/sys/kern/kern_shutdown.c +++ b/sys/kern/kern_shutdown.c @@ -420,7 +420,7 @@ shutdown_reset(void *junk, int howto) } #ifdef SMP -static uintptr_t panic_thread = NULL; +static u_int panic_cpu = NOCPU; #endif /* @@ -441,17 +441,15 @@ panic(const char *fmt, ...) #ifdef SMP /* * We don't want multiple CPU's to panic at the same time, so we - * use panic_thread as a simple spinlock. We have to keep checking - * panic_thread if we are spinning in case the panic on the first + * use panic_cpu as a simple spinlock. We have to keep checking + * panic_cpu if we are spinning in case the panic on the first * CPU is canceled. */ - if (panic_thread != curthread) - while (atomic_cmpset_ptr(&panic_thread, NULL, curthread) == 0) - while (panic_thread != NULL) { -#ifdef __i386__ - ia32_pause(); -#endif - } + if (panic_cpu != PCPU_GET(cpuid)) + while (atomic_cmpset_int(&panic_cpu, NOCPU, + PCPU_GET(cpuid)) == 0) + while (panic_cpu != NOCPU) + ; /* nothing */ #endif bootopt = RB_AUTOBOOT | RB_DUMP; @@ -483,7 +481,7 @@ panic(const char *fmt, ...) /* See if the user aborted the panic, in which case we continue. */ if (panicstr == NULL) { #ifdef SMP - atomic_store_rel_ptr(&panic_thread, NULL); + atomic_store_rel_int(&panic_cpu, NOCPU); #endif return; } |
