|
@@ -49,6 +49,15 @@ static long no_blink(int state)
|
|
long (*panic_blink)(int state);
|
|
long (*panic_blink)(int state);
|
|
EXPORT_SYMBOL(panic_blink);
|
|
EXPORT_SYMBOL(panic_blink);
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Stop ourself in panic -- architecture code may override this
|
|
|
|
+ */
|
|
|
|
+void __weak panic_smp_self_stop(void)
|
|
|
|
+{
|
|
|
|
+ while (1)
|
|
|
|
+ cpu_relax();
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* panic - halt the system
|
|
* panic - halt the system
|
|
* @fmt: The text string to print
|
|
* @fmt: The text string to print
|
|
@@ -59,6 +68,7 @@ EXPORT_SYMBOL(panic_blink);
|
|
*/
|
|
*/
|
|
void panic(const char *fmt, ...)
|
|
void panic(const char *fmt, ...)
|
|
{
|
|
{
|
|
|
|
+ static DEFINE_SPINLOCK(panic_lock);
|
|
static char buf[1024];
|
|
static char buf[1024];
|
|
va_list args;
|
|
va_list args;
|
|
long i, i_next = 0;
|
|
long i, i_next = 0;
|
|
@@ -68,8 +78,14 @@ void panic(const char *fmt, ...)
|
|
* It's possible to come here directly from a panic-assertion and
|
|
* It's possible to come here directly from a panic-assertion and
|
|
* not have preempt disabled. Some functions called from here want
|
|
* not have preempt disabled. Some functions called from here want
|
|
* preempt to be disabled. No point enabling it later though...
|
|
* preempt to be disabled. No point enabling it later though...
|
|
|
|
+ *
|
|
|
|
+ * Only one CPU is allowed to execute the panic code from here. For
|
|
|
|
+ * multiple parallel invocations of panic, all other CPUs either
|
|
|
|
+ * stop themself or will wait until they are stopped by the 1st CPU
|
|
|
|
+ * with smp_send_stop().
|
|
*/
|
|
*/
|
|
- preempt_disable();
|
|
|
|
|
|
+ if (!spin_trylock(&panic_lock))
|
|
|
|
+ panic_smp_self_stop();
|
|
|
|
|
|
console_verbose();
|
|
console_verbose();
|
|
bust_spinlocks(1);
|
|
bust_spinlocks(1);
|