From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752053AbcJJEKK (ORCPT ); Mon, 10 Oct 2016 00:10:10 -0400 Received: from mail-pa0-f68.google.com ([209.85.220.68]:34926 "EHLO mail-pa0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750909AbcJJEKH (ORCPT ); Mon, 10 Oct 2016 00:10:07 -0400 From: Wanpeng Li X-Google-Original-From: Wanpeng Li To: linux-kernel@vger.kernel.org Cc: Wanpeng Li , Ingo Molnar , Mike Galbraith , Peter Zijlstra , Thomas Gleixner Subject: [PATCH] sched/core: Fix kick offline cpu to do nohz idle load balance Date: Mon, 10 Oct 2016 12:10:00 +0800 Message-Id: <1476072600-3619-1-git-send-email-wanpeng.li@hotmail.com> X-Mailer: git-send-email 1.9.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Wanpeng Li 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 Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Thomas Gleixner Signed-off-by: Wanpeng Li --- 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