Skip to content

Commit 896260a

Browse files
diandersakpm00
authored andcommitted
watchdog/softlockup: use printk_cpu_sync_get_irqsave() to serialize reporting
Instead of introducing a spinlock, use printk_cpu_sync_get_irqsave() and printk_cpu_sync_put_irqrestore() to serialize softlockup reporting. Alone this doesn't have any real advantage over the spinlock, but this will allow us to use the same function in a future change to also serialize hardlockup crawls. NOTE: for the most part this serialization is important because we often end up in the show_regs() path and that has no built-in serialization if there are multiple callers at once. However, even in the case where we end up in the dump_stack() path this still has some advantages because the stack will be guaranteed to be together in the logs with the lockup message with no interleaving. NOTE: the fact that printk_cpu_sync_get_irqsave() is allowed to be called multiple times on the same CPU is important here. Specifically we hold the "lock" while calling dump_stack() which also gets the same "lock". This is explicitly documented to be OK and means we don't need to introduce a variant of dump_stack() that doesn't grab the lock. Link: https://lkml.kernel.org/r/20231220131534.2.Ia5906525d440d8e8383cde31b7c61c2aadc8f907@changeid Signed-off-by: Douglas Anderson <dianders@chromium.org> Reviewed-by: John Ogness <john.ogness@linutronix.de> Reviewed-by: Li Zhe <lizhe.67@bytedance.com> Cc: Lecopzer Chen <lecopzer.chen@mediatek.com> Cc: Petr Mladek <pmladek@suse.com> Cc: Pingfan Liu <kernelfans@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent 6dcde5d commit 896260a

1 file changed

Lines changed: 3 additions & 3 deletions

File tree

kernel/watchdog.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
454454
struct pt_regs *regs = get_irq_regs();
455455
int duration;
456456
int softlockup_all_cpu_backtrace = sysctl_softlockup_all_cpu_backtrace;
457-
static DEFINE_SPINLOCK(watchdog_output_lock);
457+
unsigned long flags;
458458

459459
if (!watchdog_enabled)
460460
return HRTIMER_NORESTART;
@@ -521,7 +521,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
521521
/* Start period for the next softlockup warning. */
522522
update_report_ts();
523523

524-
spin_lock(&watchdog_output_lock);
524+
printk_cpu_sync_get_irqsave(flags);
525525
pr_emerg("BUG: soft lockup - CPU#%d stuck for %us! [%s:%d]\n",
526526
smp_processor_id(), duration,
527527
current->comm, task_pid_nr(current));
@@ -531,7 +531,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
531531
show_regs(regs);
532532
else
533533
dump_stack();
534-
spin_unlock(&watchdog_output_lock);
534+
printk_cpu_sync_put_irqrestore(flags);
535535

536536
if (softlockup_all_cpu_backtrace) {
537537
trigger_allbutcpu_cpu_backtrace(smp_processor_id());

0 commit comments

Comments
 (0)