Skip to content

Commit 96c1fa0

Browse files
Paul GortmakerKAGA-KOKO
Paul Gortmaker
authored andcommitted
tick/rcu: Fix false positive "softirq work is pending" messages
In commit 0345691 ("tick/rcu: Stop allowing RCU_SOFTIRQ in idle") the new function report_idle_softirq() was created by breaking code out of the existing can_stop_idle_tick() for kernels v5.18 and newer. In doing so, the code essentially went from a one conditional: if (a && b && c) warn(); to a three conditional: if (!a) return; if (!b) return; if (!c) return; warn(); But that conversion got the condition for the RT specific local_bh_blocked() wrong. The original condition was: !local_bh_blocked() but the conversion failed to negate it so it ended up as: if (!local_bh_blocked()) return false; This issue lay dormant until another fixup for the same commit was added in commit a7e282c ("tick/rcu: Fix bogus ratelimit condition"). This commit realized the ratelimit was essentially set to zero instead of ten, and hence *no* softirq pending messages would ever be issued. Once this commit was backported via linux-stable, both the v6.1 and v6.4 preempt-rt kernels started printing out 10 instances of this at boot: NOHZ tick-stop error: local softirq work is pending, handler #80!!! Remove the negation and return when local_bh_blocked() evaluates to true to bring the correct behaviour back. Fixes: 0345691 ("tick/rcu: Stop allowing RCU_SOFTIRQ in idle") Signed-off-by: Paul Gortmaker <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]> Tested-by: Ahmad Fatoum <[email protected]> Reviewed-by: Wen Yang <[email protected]> Acked-by: Frederic Weisbecker <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 2dde18c commit 96c1fa0

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

kernel/time/tick-sched.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1045,7 +1045,7 @@ static bool report_idle_softirq(void)
10451045
return false;
10461046

10471047
/* On RT, softirqs handling may be waiting on some lock */
1048-
if (!local_bh_blocked())
1048+
if (local_bh_blocked())
10491049
return false;
10501050

10511051
pr_warn("NOHZ tick-stop error: local softirq work is pending, handler #%02x!!!\n",

0 commit comments

Comments
 (0)