Patch "rcu/nocb: Fix rcuog wake-up from offline softirq" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    rcu/nocb: Fix rcuog wake-up from offline softirq

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     rcu-nocb-fix-rcuog-wake-up-from-offline-softirq.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 44261d09fa8413d47477d4518c0ee84dacb589a1
Author: Frederic Weisbecker <frederic@xxxxxxxxxx>
Date:   Thu Oct 10 18:36:09 2024 +0200

    rcu/nocb: Fix rcuog wake-up from offline softirq
    
    [ Upstream commit f7345ccc62a4b880cf76458db5f320725f28e400 ]
    
    After a CPU has set itself offline and before it eventually calls
    rcutree_report_cpu_dead(), there are still opportunities for callbacks
    to be enqueued, for example from a softirq. When that happens on NOCB,
    the rcuog wake-up is deferred through an IPI to an online CPU in order
    not to call into the scheduler and risk arming the RT-bandwidth after
    hrtimers have been migrated out and disabled.
    
    But performing a synchronized IPI from a softirq is buggy as reported in
    the following scenario:
    
            WARNING: CPU: 1 PID: 26 at kernel/smp.c:633 smp_call_function_single
            Modules linked in: rcutorture torture
            CPU: 1 UID: 0 PID: 26 Comm: migration/1 Not tainted 6.11.0-rc1-00012-g9139f93209d1 #1
            Stopper: multi_cpu_stop+0x0/0x320 <- __stop_cpus+0xd0/0x120
            RIP: 0010:smp_call_function_single
            <IRQ>
            swake_up_one_online
            __call_rcu_nocb_wake
            __call_rcu_common
            ? rcu_torture_one_read
            call_timer_fn
            __run_timers
            run_timer_softirq
            handle_softirqs
            irq_exit_rcu
            ? tick_handle_periodic
            sysvec_apic_timer_interrupt
            </IRQ>
    
    Fix this with forcing deferred rcuog wake up through the NOCB timer when
    the CPU is offline. The actual wake up will happen from
    rcutree_report_cpu_dead().
    
    Reported-by: kernel test robot <oliver.sang@xxxxxxxxx>
    Closes: https://lore.kernel.org/oe-lkp/202409231644.4c55582d-lkp@xxxxxxxxx
    Fixes: 9139f93209d1 ("rcu/nocb: Fix RT throttling hrtimer armed from offline CPU")
    Reviewed-by: "Joel Fernandes (Google)" <joel@xxxxxxxxxxxxxxxxx>
    Signed-off-by: Frederic Weisbecker <frederic@xxxxxxxxxx>
    Signed-off-by: Neeraj Upadhyay <neeraj.upadhyay@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/rcu/tree_nocb.h b/kernel/rcu/tree_nocb.h
index 7a0bce3f784df..8993b2322be2b 100644
--- a/kernel/rcu/tree_nocb.h
+++ b/kernel/rcu/tree_nocb.h
@@ -568,13 +568,19 @@ static void __call_rcu_nocb_wake(struct rcu_data *rdp, bool was_alldone,
 			rcu_nocb_unlock(rdp);
 			wake_nocb_gp_defer(rdp, RCU_NOCB_WAKE_LAZY,
 					   TPS("WakeLazy"));
-		} else if (!irqs_disabled_flags(flags)) {
+		} else if (!irqs_disabled_flags(flags) && cpu_online(rdp->cpu)) {
 			/* ... if queue was empty ... */
 			rcu_nocb_unlock(rdp);
 			wake_nocb_gp(rdp, false);
 			trace_rcu_nocb_wake(rcu_state.name, rdp->cpu,
 					    TPS("WakeEmpty"));
 		} else {
+			/*
+			 * Don't do the wake-up upfront on fragile paths.
+			 * Also offline CPUs can't call swake_up_one_online() from
+			 * (soft-)IRQs. Rely on the final deferred wake-up from
+			 * rcutree_report_cpu_dead()
+			 */
 			rcu_nocb_unlock(rdp);
 			wake_nocb_gp_defer(rdp, RCU_NOCB_WAKE,
 					   TPS("WakeEmptyIsDeferred"));




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux