From: Wanpeng Li <wanpeng...@hotmail.com> WARNING: CPU: 0 PID: 3404 at arch/x86/kernel/smp.c:125 native_smp_send_reschedule+0x3f/0x50 CPU: 0 PID: 3404 Comm: qemu-system-x86 Not tainted 4.8.0+ #21 Call Trace: __warn+0xd1/0xf0 warn_slowpath_null+0x1d/0x20 native_smp_send_reschedule+0x3f/0x50 trigger_load_balance+0x29c/0x4a0 ? trigger_load_balance+0x72/0x4a0 scheduler_tick+0x9f/0xd0 ? tick_sched_do_timer+0x50/0x50 update_process_times+0x47/0x60 tick_sched_handle.isra.24+0x25/0x60 tick_sched_timer+0x3d/0x70 __hrtimer_run_queues+0xf4/0x510 hrtimer_interrupt+0xb7/0x1d0 local_apic_timer_interrupt+0x35/0x60 smp_apic_timer_interrupt+0x3d/0x50 apic_timer_interrupt+0x96/0xa0
If there is a need to kick the idle load balancer, an ILB will be selected to perform nohz idle load balance, however, if the selected ILB is in the process of offline, smp_sched_reschedule() which generates a sched IPI will splat as above. CPU0 CPU1 find_new_ilb() set_rq_offline() smp_sched_reschedule() Oops nohz_balance_exit_idle() This patch fix it by exiting nohz idle balance before set cpu offline. Cc: Ingo Molnar <mi...@kernel.org> Cc: Mike Galbraith <efa...@gmx.de> Cc: Peter Zijlstra <pet...@infradead.org> Cc: Thomas Gleixner <t...@linutronix.de> Signed-off-by: Wanpeng Li <wanpeng...@hotmail.com> --- kernel/sched/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 94732d1..7c83f99 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -7412,6 +7412,7 @@ int sched_cpu_dying(unsigned int cpu) /* Handle pending wakeups and then migrate everything off */ sched_ttwu_pending(); + nohz_balance_exit_idle(cpu); raw_spin_lock_irqsave(&rq->lock, flags); if (rq->rd) { BUG_ON(!cpumask_test_cpu(cpu, rq->rd->span)); @@ -7422,7 +7423,6 @@ int sched_cpu_dying(unsigned int cpu) raw_spin_unlock_irqrestore(&rq->lock, flags); calc_load_migrate(rq); update_max_interval(); - nohz_balance_exit_idle(cpu); hrtick_clear(rq); return 0; } -- 1.9.1