Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'rcu.fixes.6.12-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rcu/linux

Pull RCU fix from Neeraj Upadhyay:
"Fix rcuog kthread wakeup invocation from softirq context on a CPU
which has been marked offline.

This can happen when new callbacks are enqueued from a softirq on an
offline CPU before it calls rcutree_report_cpu_dead(). When this
happens on NOCB configuration, the rcuog wake-up is deferred through
an IPI to an online CPU. This is done to avoid call into the scheduler
which can risk arming the RT-bandwidth after hrtimers have been
migrated out and disabled.

However, doing IPI call from softirq is not allowed: Fix this by
forcing deferred rcuog wakeup through the NOCB timer when the CPU is
offline"

* tag 'rcu.fixes.6.12-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rcu/linux:
rcu/nocb: Fix rcuog wake-up from offline softirq

+7 -1
+7 -1
kernel/rcu/tree_nocb.h
··· 554 554 rcu_nocb_unlock(rdp); 555 555 wake_nocb_gp_defer(rdp, RCU_NOCB_WAKE_LAZY, 556 556 TPS("WakeLazy")); 557 - } else if (!irqs_disabled_flags(flags)) { 557 + } else if (!irqs_disabled_flags(flags) && cpu_online(rdp->cpu)) { 558 558 /* ... if queue was empty ... */ 559 559 rcu_nocb_unlock(rdp); 560 560 wake_nocb_gp(rdp, false); 561 561 trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, 562 562 TPS("WakeEmpty")); 563 563 } else { 564 + /* 565 + * Don't do the wake-up upfront on fragile paths. 566 + * Also offline CPUs can't call swake_up_one_online() from 567 + * (soft-)IRQs. Rely on the final deferred wake-up from 568 + * rcutree_report_cpu_dead() 569 + */ 564 570 rcu_nocb_unlock(rdp); 565 571 wake_nocb_gp_defer(rdp, RCU_NOCB_WAKE, 566 572 TPS("WakeEmptyIsDeferred"));