Blow away the panic mutex in favor of using a single atomic_cmpset() on a

panic_cpu shared variable.  I used a simple atomic operation here instead
of a spin lock as it seemed to be excessive overhead.  Also, this can avoid
recursive panics if, for example, witness is broken.
This commit is contained in:
John Baldwin 2001-04-17 04:18:08 +00:00
parent 3c41f323c9
commit abd9053ee4
11 changed files with 9 additions and 39 deletions

View File

@ -281,14 +281,11 @@ globaldata_find(int cpuid)
/* lock around the MP rendezvous */ /* lock around the MP rendezvous */
static struct mtx smp_rv_mtx; static struct mtx smp_rv_mtx;
/* only 1 CPU can panic at a time :) */
struct mtx panic_mtx;
static void static void
init_locks(void) init_locks(void)
{ {
mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN);
mtx_init(&panic_mtx, "panic", MTX_DEF);
} }
void void

View File

@ -357,9 +357,6 @@ struct mtx com_mtx;
/* lock around the MP rendezvous */ /* lock around the MP rendezvous */
static struct mtx smp_rv_mtx; static struct mtx smp_rv_mtx;
/* only 1 CPU can panic at a time :) */
struct mtx panic_mtx;
static void static void
init_locks(void) init_locks(void)
{ {
@ -371,7 +368,6 @@ init_locks(void)
mtx_init(&mcount_mtx, "mcount", MTX_DEF); mtx_init(&mcount_mtx, "mcount", MTX_DEF);
mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN);
mtx_init(&panic_mtx, "panic", MTX_DEF);
#ifdef USE_COMLOCK #ifdef USE_COMLOCK
mtx_init(&com_mtx, "com", MTX_SPIN); mtx_init(&com_mtx, "com", MTX_SPIN);

View File

@ -357,9 +357,6 @@ struct mtx com_mtx;
/* lock around the MP rendezvous */ /* lock around the MP rendezvous */
static struct mtx smp_rv_mtx; static struct mtx smp_rv_mtx;
/* only 1 CPU can panic at a time :) */
struct mtx panic_mtx;
static void static void
init_locks(void) init_locks(void)
{ {
@ -371,7 +368,6 @@ init_locks(void)
mtx_init(&mcount_mtx, "mcount", MTX_DEF); mtx_init(&mcount_mtx, "mcount", MTX_DEF);
mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN);
mtx_init(&panic_mtx, "panic", MTX_DEF);
#ifdef USE_COMLOCK #ifdef USE_COMLOCK
mtx_init(&com_mtx, "com", MTX_SPIN); mtx_init(&com_mtx, "com", MTX_SPIN);

View File

@ -357,9 +357,6 @@ struct mtx com_mtx;
/* lock around the MP rendezvous */ /* lock around the MP rendezvous */
static struct mtx smp_rv_mtx; static struct mtx smp_rv_mtx;
/* only 1 CPU can panic at a time :) */
struct mtx panic_mtx;
static void static void
init_locks(void) init_locks(void)
{ {
@ -371,7 +368,6 @@ init_locks(void)
mtx_init(&mcount_mtx, "mcount", MTX_DEF); mtx_init(&mcount_mtx, "mcount", MTX_DEF);
mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN);
mtx_init(&panic_mtx, "panic", MTX_DEF);
#ifdef USE_COMLOCK #ifdef USE_COMLOCK
mtx_init(&com_mtx, "com", MTX_SPIN); mtx_init(&com_mtx, "com", MTX_SPIN);

View File

@ -357,9 +357,6 @@ struct mtx com_mtx;
/* lock around the MP rendezvous */ /* lock around the MP rendezvous */
static struct mtx smp_rv_mtx; static struct mtx smp_rv_mtx;
/* only 1 CPU can panic at a time :) */
struct mtx panic_mtx;
static void static void
init_locks(void) init_locks(void)
{ {
@ -371,7 +368,6 @@ init_locks(void)
mtx_init(&mcount_mtx, "mcount", MTX_DEF); mtx_init(&mcount_mtx, "mcount", MTX_DEF);
mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN);
mtx_init(&panic_mtx, "panic", MTX_DEF);
#ifdef USE_COMLOCK #ifdef USE_COMLOCK
mtx_init(&com_mtx, "com", MTX_SPIN); mtx_init(&com_mtx, "com", MTX_SPIN);

View File

@ -357,9 +357,6 @@ struct mtx com_mtx;
/* lock around the MP rendezvous */ /* lock around the MP rendezvous */
static struct mtx smp_rv_mtx; static struct mtx smp_rv_mtx;
/* only 1 CPU can panic at a time :) */
struct mtx panic_mtx;
static void static void
init_locks(void) init_locks(void)
{ {
@ -371,7 +368,6 @@ init_locks(void)
mtx_init(&mcount_mtx, "mcount", MTX_DEF); mtx_init(&mcount_mtx, "mcount", MTX_DEF);
mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN);
mtx_init(&panic_mtx, "panic", MTX_DEF);
#ifdef USE_COMLOCK #ifdef USE_COMLOCK
mtx_init(&com_mtx, "com", MTX_SPIN); mtx_init(&com_mtx, "com", MTX_SPIN);

View File

@ -357,9 +357,6 @@ struct mtx com_mtx;
/* lock around the MP rendezvous */ /* lock around the MP rendezvous */
static struct mtx smp_rv_mtx; static struct mtx smp_rv_mtx;
/* only 1 CPU can panic at a time :) */
struct mtx panic_mtx;
static void static void
init_locks(void) init_locks(void)
{ {
@ -371,7 +368,6 @@ init_locks(void)
mtx_init(&mcount_mtx, "mcount", MTX_DEF); mtx_init(&mcount_mtx, "mcount", MTX_DEF);
mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN);
mtx_init(&panic_mtx, "panic", MTX_DEF);
#ifdef USE_COMLOCK #ifdef USE_COMLOCK
mtx_init(&com_mtx, "com", MTX_SPIN); mtx_init(&com_mtx, "com", MTX_SPIN);

View File

@ -548,6 +548,10 @@ dumpstatus(vm_offset_t addr, long count)
return 0; return 0;
} }
#ifdef SMP
static u_int panic_cpu = NOCPU;
#endif
/* /*
* Panic is called on unresolvable fatal errors. It prints "panic: mesg", * 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 * and then reboots. If we are called twice, then we avoid trying to sync
@ -562,7 +566,11 @@ panic(const char *fmt, ...)
#ifdef SMP #ifdef SMP
/* Only 1 CPU can panic at a time */ /* 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 #endif
bootopt = RB_AUTOBOOT | RB_DUMP; bootopt = RB_AUTOBOOT | RB_DUMP;

View File

@ -357,9 +357,6 @@ struct mtx com_mtx;
/* lock around the MP rendezvous */ /* lock around the MP rendezvous */
static struct mtx smp_rv_mtx; static struct mtx smp_rv_mtx;
/* only 1 CPU can panic at a time :) */
struct mtx panic_mtx;
static void static void
init_locks(void) init_locks(void)
{ {
@ -371,7 +368,6 @@ init_locks(void)
mtx_init(&mcount_mtx, "mcount", MTX_DEF); mtx_init(&mcount_mtx, "mcount", MTX_DEF);
mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN);
mtx_init(&panic_mtx, "panic", MTX_DEF);
#ifdef USE_COMLOCK #ifdef USE_COMLOCK
mtx_init(&com_mtx, "com", MTX_SPIN); mtx_init(&com_mtx, "com", MTX_SPIN);

View File

@ -232,15 +232,11 @@ globaldata_find(int cpuno)
/* lock around the MP rendezvous */ /* lock around the MP rendezvous */
static struct mtx smp_rv_mtx; static struct mtx smp_rv_mtx;
/* only 1 CPU can panic at a time :) */
struct mtx panic_mtx;
static void static void
init_locks(void) init_locks(void)
{ {
mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN); mtx_init(&smp_rv_mtx, "smp rendezvous", MTX_SPIN);
mtx_init(&panic_mtx, "panic", MTX_DEF);
} }
void void

View File

@ -81,9 +81,6 @@ extern int lbolt; /* once a second sleep address */
extern int tickdelta; extern int tickdelta;
extern long timedelta; extern long timedelta;
/* global data in mp_machdep.c */
extern struct mtx panic_mtx;
#endif /* _KERNEL */ #endif /* _KERNEL */
/* /*