softlockup: serialized softlockup's log
[linux-2.6-block.git] / kernel / watchdog.c
index 5cd6d4e269157973acecd00afc91646720fee2be..bf30a6fac66518b3bfd22ece7bea206f1292eefe 100644 (file)
@@ -448,6 +448,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
        struct pt_regs *regs = get_irq_regs();
        int duration;
        int softlockup_all_cpu_backtrace = sysctl_softlockup_all_cpu_backtrace;
+       static DEFINE_SPINLOCK(watchdog_output_lock);
 
        if (!watchdog_enabled)
                return HRTIMER_NORESTART;
@@ -514,6 +515,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
                /* Start period for the next softlockup warning. */
                update_report_ts();
 
+               spin_lock(&watchdog_output_lock);
                pr_emerg("BUG: soft lockup - CPU#%d stuck for %us! [%s:%d]\n",
                        smp_processor_id(), duration,
                        current->comm, task_pid_nr(current));
@@ -523,6 +525,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
                        show_regs(regs);
                else
                        dump_stack();
+               spin_unlock(&watchdog_output_lock);
 
                if (softlockup_all_cpu_backtrace) {
                        trigger_allbutcpu_cpu_backtrace(smp_processor_id());