diff --git a/sys/alpha/alpha/mp_machdep.c b/sys/alpha/alpha/mp_machdep.c index 33741f0abce2..e12a68a71328 100644 --- a/sys/alpha/alpha/mp_machdep.c +++ b/sys/alpha/alpha/mp_machdep.c @@ -281,14 +281,11 @@ globaldata_find(int cpuid) /* lock around the MP rendezvous */ static struct mtx smp_rv_mtx; -/* only 1 CPU can panic at a time :) */ -struct mtx panic_mtx; static void init_locks(void) { mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); - mtx_init(&panic_mtx, "panic", MTX_DEF); } void diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c index 66ab9f3f6839..7bc0a320d028 100644 --- a/sys/amd64/amd64/mp_machdep.c +++ b/sys/amd64/amd64/mp_machdep.c @@ -357,9 +357,6 @@ struct mtx com_mtx; /* lock around the MP rendezvous */ static struct mtx smp_rv_mtx; -/* only 1 CPU can panic at a time :) */ -struct mtx panic_mtx; - static void init_locks(void) { @@ -371,7 +368,6 @@ init_locks(void) mtx_init(&mcount_mtx, "mcount", MTX_DEF); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); - mtx_init(&panic_mtx, "panic", MTX_DEF); #ifdef USE_COMLOCK mtx_init(&com_mtx, "com", MTX_SPIN); diff --git a/sys/amd64/amd64/mptable.c b/sys/amd64/amd64/mptable.c index 66ab9f3f6839..7bc0a320d028 100644 --- a/sys/amd64/amd64/mptable.c +++ b/sys/amd64/amd64/mptable.c @@ -357,9 +357,6 @@ struct mtx com_mtx; /* lock around the MP rendezvous */ static struct mtx smp_rv_mtx; -/* only 1 CPU can panic at a time :) */ -struct mtx panic_mtx; - static void init_locks(void) { @@ -371,7 +368,6 @@ init_locks(void) mtx_init(&mcount_mtx, "mcount", MTX_DEF); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); - mtx_init(&panic_mtx, "panic", MTX_DEF); #ifdef USE_COMLOCK mtx_init(&com_mtx, "com", MTX_SPIN); diff --git a/sys/amd64/include/mptable.h b/sys/amd64/include/mptable.h index 66ab9f3f6839..7bc0a320d028 100644 --- a/sys/amd64/include/mptable.h +++ b/sys/amd64/include/mptable.h @@ -357,9 +357,6 @@ struct mtx com_mtx; /* lock around the MP rendezvous */ static struct mtx smp_rv_mtx; -/* only 1 CPU can panic at a time :) */ -struct mtx panic_mtx; - static void init_locks(void) { @@ -371,7 +368,6 @@ init_locks(void) mtx_init(&mcount_mtx, "mcount", MTX_DEF); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); - mtx_init(&panic_mtx, "panic", MTX_DEF); #ifdef USE_COMLOCK mtx_init(&com_mtx, "com", MTX_SPIN); diff --git a/sys/i386/i386/mp_machdep.c b/sys/i386/i386/mp_machdep.c index 66ab9f3f6839..7bc0a320d028 100644 --- a/sys/i386/i386/mp_machdep.c +++ b/sys/i386/i386/mp_machdep.c @@ -357,9 +357,6 @@ struct mtx com_mtx; /* lock around the MP rendezvous */ static struct mtx smp_rv_mtx; -/* only 1 CPU can panic at a time :) */ -struct mtx panic_mtx; - static void init_locks(void) { @@ -371,7 +368,6 @@ init_locks(void) mtx_init(&mcount_mtx, "mcount", MTX_DEF); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); - mtx_init(&panic_mtx, "panic", MTX_DEF); #ifdef USE_COMLOCK mtx_init(&com_mtx, "com", MTX_SPIN); diff --git a/sys/i386/i386/mptable.c b/sys/i386/i386/mptable.c index 66ab9f3f6839..7bc0a320d028 100644 --- a/sys/i386/i386/mptable.c +++ b/sys/i386/i386/mptable.c @@ -357,9 +357,6 @@ struct mtx com_mtx; /* lock around the MP rendezvous */ static struct mtx smp_rv_mtx; -/* only 1 CPU can panic at a time :) */ -struct mtx panic_mtx; - static void init_locks(void) { @@ -371,7 +368,6 @@ init_locks(void) mtx_init(&mcount_mtx, "mcount", MTX_DEF); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); - mtx_init(&panic_mtx, "panic", MTX_DEF); #ifdef USE_COMLOCK mtx_init(&com_mtx, "com", MTX_SPIN); diff --git a/sys/i386/include/mptable.h b/sys/i386/include/mptable.h index 66ab9f3f6839..7bc0a320d028 100644 --- a/sys/i386/include/mptable.h +++ b/sys/i386/include/mptable.h @@ -357,9 +357,6 @@ struct mtx com_mtx; /* lock around the MP rendezvous */ static struct mtx smp_rv_mtx; -/* only 1 CPU can panic at a time :) */ -struct mtx panic_mtx; - static void init_locks(void) { @@ -371,7 +368,6 @@ init_locks(void) mtx_init(&mcount_mtx, "mcount", MTX_DEF); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); - mtx_init(&panic_mtx, "panic", MTX_DEF); #ifdef USE_COMLOCK mtx_init(&com_mtx, "com", MTX_SPIN); diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c index ad79fdcbbb79..55c4ba47d973 100644 --- a/sys/kern/kern_shutdown.c +++ b/sys/kern/kern_shutdown.c @@ -548,6 +548,10 @@ dumpstatus(vm_offset_t addr, long count) return 0; } +#ifdef SMP +static u_int panic_cpu = NOCPU; +#endif + /* * Panic is called on unresolvable fatal errors. It prints "panic: mesg", * and then reboots. If we are called twice, then we avoid trying to sync @@ -562,7 +566,11 @@ panic(const char *fmt, ...) #ifdef SMP /* Only 1 CPU can panic at a time */ - mtx_lock(&panic_mtx); + if (panic_cpu != PCPU_GET(cpuid) && + atomic_cmpset_int(&panic_cpu, NOCPU, PCPU_GET(cpuid)) == 0) { + for (;;) + ; /* nothing */ + } #endif bootopt = RB_AUTOBOOT | RB_DUMP; diff --git a/sys/kern/subr_smp.c b/sys/kern/subr_smp.c index 66ab9f3f6839..7bc0a320d028 100644 --- a/sys/kern/subr_smp.c +++ b/sys/kern/subr_smp.c @@ -357,9 +357,6 @@ struct mtx com_mtx; /* lock around the MP rendezvous */ static struct mtx smp_rv_mtx; -/* only 1 CPU can panic at a time :) */ -struct mtx panic_mtx; - static void init_locks(void) { @@ -371,7 +368,6 @@ init_locks(void) mtx_init(&mcount_mtx, "mcount", MTX_DEF); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); - mtx_init(&panic_mtx, "panic", MTX_DEF); #ifdef USE_COMLOCK mtx_init(&com_mtx, "com", MTX_SPIN); diff --git a/sys/powerpc/powerpc/mp_machdep.c b/sys/powerpc/powerpc/mp_machdep.c index 8ca5b047d5e3..e8c65f3104e5 100644 --- a/sys/powerpc/powerpc/mp_machdep.c +++ b/sys/powerpc/powerpc/mp_machdep.c @@ -232,15 +232,11 @@ globaldata_find(int cpuno) /* lock around the MP rendezvous */ static struct mtx smp_rv_mtx; -/* only 1 CPU can panic at a time :) */ -struct mtx panic_mtx; - static void init_locks(void) { mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); - mtx_init(&panic_mtx, "panic", MTX_DEF); } void diff --git a/sys/sys/kernel.h b/sys/sys/kernel.h index 3bcef6f1e173..443874f62816 100644 --- a/sys/sys/kernel.h +++ b/sys/sys/kernel.h @@ -81,9 +81,6 @@ extern int lbolt; /* once a second sleep address */ extern int tickdelta; extern long timedelta; -/* global data in mp_machdep.c */ -extern struct mtx panic_mtx; - #endif /* _KERNEL */ /*