• Frederic Weisbecker's avatar
    rcu/nocb: Fix rcuog wake-up from offline softirq · f7345ccc
    Frederic Weisbecker authored
    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-g9139f932 #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: default avatarkernel test robot <oliver.sang@intel.com>
    Closes: https://lore.kernel.org/oe-lkp/202409231644.4c55582d-lkp@intel.com
    Fixes: 9139f932 ("rcu/nocb: Fix RT throttling hrtimer armed from offline CPU")
    Reviewed-by: default avatar"Joel Fernandes (Google)" <joel@joelfernandes.org>
    Signed-off-by: default avatarFrederic Weisbecker <frederic@kernel.org>
    Signed-off-by: default avatarNeeraj Upadhyay <neeraj.upadhyay@kernel.org>
    f7345ccc
tree_nocb.h 50.3 KB