Skip to content

Commit 1a6a464

Browse files
Frederic WeisbeckerKAGA-KOKO
Frederic Weisbecker
authored andcommitted
timers: Tag (hr)timer softirq as hotplug safe
Specific stress involving frequent CPU-hotplug operations, such as running rcutorture for example, may trigger the following message: NOHZ tick-stop error: local softirq work is pending, handler #2!!!" This happens in the CPU-down hotplug process, after CPUHP_AP_SMPBOOT_THREADS whose teardown callback parks ksoftirqd, and before the target CPU shuts down through CPUHP_AP_IDLE_DEAD. In this fragile intermediate state, softirqs waiting for threaded handling may be forever ignored and eventually reported by the idle task as in the above example. However some vectors are known to be safe as long as the corresponding subsystems have teardown callbacks handling the migration of their events. The above error message reports pending timers softirq although this vector can be considered as hotplug safe because the CPUHP_TIMERS_PREPARE teardown callback performs the necessary migration of timers after the death of the CPU. Hrtimers also have a similar hotplug handling. Therefore this error message, as far as (hr-)timers are concerned, can be considered spurious and the relevant softirq vectors can be marked as hotplug safe. Fixes: 0345691 ("tick/rcu: Stop allowing RCU_SOFTIRQ in idle") Signed-off-by: Frederic Weisbecker <frederic@kernel.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Joel Fernandes (Google) <joel@joelfernandes.org> Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20230912104406.312185-6-frederic@kernel.org
1 parent 0bb80ec commit 1a6a464

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

include/linux/interrupt.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -569,8 +569,12 @@ enum
569569
* 2) rcu_report_dead() reports the final quiescent states.
570570
*
571571
* _ IRQ_POLL: irq_poll_cpu_dead() migrates the queue
572+
*
573+
* _ (HR)TIMER_SOFTIRQ: (hr)timers_dead_cpu() migrates the queue
572574
*/
573-
#define SOFTIRQ_HOTPLUG_SAFE_MASK (BIT(RCU_SOFTIRQ) | BIT(IRQ_POLL_SOFTIRQ))
575+
#define SOFTIRQ_HOTPLUG_SAFE_MASK (BIT(TIMER_SOFTIRQ) | BIT(IRQ_POLL_SOFTIRQ) |\
576+
BIT(HRTIMER_SOFTIRQ) | BIT(RCU_SOFTIRQ))
577+
574578

575579
/* map softirq index to softirq name. update 'softirq_to_name' in
576580
* kernel/softirq.c when adding a new softirq.

0 commit comments

Comments
 (0)