Use bit_lock operation to prevent multiple soft-lockups reports when one CPU already triggered dumping backtraces from all CPUs. It allows to remove the explicit memory barriers and misleading comments. Suggested-by: Peter Zijlstra <peterz@xxxxxxxxxxxxx> Signed-off-by: Petr Mladek <pmladek@xxxxxxxx> --- Andrew, this patch can be put on top of the patchset fixing/cleaning softlockup watchdog code. Feel free to squash it into the other patch fixing the barriers. Or should I resend the entire patchset again, please? Best Regards, Petr kernel/watchdog.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/kernel/watchdog.c b/kernel/watchdog.c index c050323fcd33..090b6bc4de79 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c @@ -410,13 +410,8 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer) * engaged in dumping all cpu back traces. */ if (softlockup_all_cpu_backtrace) { - if (test_and_set_bit(0, &soft_lockup_nmi_warn)) + if (test_and_set_bit_lock(0, &soft_lockup_nmi_warn)) return HRTIMER_RESTART; - /* - * Make sure that reports are serialized. Start - * printing after getting the exclusive rights. - */ - smp_mb__after_atomic(); } /* Start period for the next softlockup warning. */ @@ -434,13 +429,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer) if (softlockup_all_cpu_backtrace) { trigger_allbutself_cpu_backtrace(); - /* - * Make sure that everything is printed before - * another CPU is allowed to report lockup again. - */ - smp_mb__before_atomic(); - /* Allow a further report. */ - clear_bit(0, &soft_lockup_nmi_warn); + clear_bit_unlock(0, &soft_lockup_nmi_warn); } add_taint(TAINT_SOFTLOCKUP, LOCKDEP_STILL_OK); -- 2.26.2