Attempt to fix recursive panics Some panics can still lock up and spew a lot of text. This helps a little. Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/kern/src/init.c b/kern/src/init.c index 658f2fa..5d27a3c 100644 --- a/kern/src/init.c +++ b/kern/src/init.c
@@ -262,6 +262,8 @@ vcprintf(fmt, ap); printk("\n"); va_end(ap); + /* Recursive panics are usually backtrace problems. Possibly printk. + * Locking panics might recurse forever. */ if (PERCPU_VAR(panic_depth) == 1) backtrace(); else @@ -269,11 +271,14 @@ core_id_early(), PERCPU_VAR(panic_depth)); printk("\n"); - PERCPU_VAR(panic_depth)--; - if (!PERCPU_VAR(panic_depth)) { - panic_printing = false; - spin_unlock_irqsave(&panic_lock); - } + /* If we're here, we panicked and currently hold the lock. We might have + * panicked recursively. We must unlock unconditionally, since the initial + * panic (which grabbed the lock) will never run again. */ + panic_printing = false; + spin_unlock_irqsave(&panic_lock); + /* And we have to clear the depth, so that we lock again next time in. + * Otherwise, we'd be unlocking without locking (which is another panic). */ + PERCPU_VAR(panic_depth) = 0; /* Let's wait long enough for other printers to finish before entering the * monitor. */