Subject: + cpu-hotplug-stop-machine-plug-race-window-that-leads-to-ipi-to-offline-cpu-v3.patch added to -mm tree To: srivatsa.bhat@xxxxxxxxxxxxxxxxxx,bp@xxxxxxx,ego@xxxxxxxxxxxxxxxxxx,fweisbec@xxxxxxxxx,hch@xxxxxxxxxxxxx,mgalbraith@xxxxxxx,mgorman@xxxxxxx,mingo@xxxxxxxxxx,oleg@xxxxxxxxxx,paulmck@xxxxxxxxxxxxxxxxxx,peterz@xxxxxxxxxxxxx,riel@xxxxxxxxxx,rjw@xxxxxxxxxxxxx,rostedt@xxxxxxxxxxx,rusty@xxxxxxxxxxxxxxx,tglx@xxxxxxxxxxxxx,tj@xxxxxxxxxx From: akpm@xxxxxxxxxxxxxxxxxxxx Date: Mon, 12 May 2014 14:58:18 -0700 The patch titled Subject: cpu-hotplug-stop-machine-plug-race-window-that-leads-to-ipi-to-offline-cpu-v3 has been added to the -mm tree. Its filename is cpu-hotplug-stop-machine-plug-race-window-that-leads-to-ipi-to-offline-cpu-v3.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/cpu-hotplug-stop-machine-plug-race-window-that-leads-to-ipi-to-offline-cpu-v3.patch and later at http://ozlabs.org/~akpm/mmotm/broken-out/cpu-hotplug-stop-machine-plug-race-window-that-leads-to-ipi-to-offline-cpu-v3.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: "Srivatsa S. Bhat" <srivatsa.bhat@xxxxxxxxxxxxxxxxxx> Subject: cpu-hotplug-stop-machine-plug-race-window-that-leads-to-ipi-to-offline-cpu-v3 Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@xxxxxxxxxxxxxxxxxx> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxxxxx> Cc: Tejun Heo <tj@xxxxxxxxxx> Cc: Rusty Russell <rusty@xxxxxxxxxxxxxxx> Cc: Frederic Weisbecker <fweisbec@xxxxxxxxx> Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx> Cc: Mel Gorman <mgorman@xxxxxxx> Cc: Rik van Riel <riel@xxxxxxxxxx> Cc: Borislav Petkov <bp@xxxxxxx> Cc: Steven Rostedt <rostedt@xxxxxxxxxxx> Cc: Mike Galbraith <mgalbraith@xxxxxxx> Cc: Gautham R Shenoy <ego@xxxxxxxxxxxxxxxxxx> Cc: "Paul E. McKenney" <paulmck@xxxxxxxxxxxxxxxxxx> Cc: Oleg Nesterov <oleg@xxxxxxxxxx> Cc: Rafael J. Wysocki <rjw@xxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- kernel/stop_machine.c | 43 +++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 24 deletions(-) diff -puN kernel/stop_machine.c~cpu-hotplug-stop-machine-plug-race-window-that-leads-to-ipi-to-offline-cpu-v3 kernel/stop_machine.c --- a/kernel/stop_machine.c~cpu-hotplug-stop-machine-plug-race-window-that-leads-to-ipi-to-offline-cpu-v3 +++ a/kernel/stop_machine.c @@ -130,8 +130,10 @@ enum multi_stop_state { MULTI_STOP_NONE, /* Awaiting everyone to be scheduled. */ MULTI_STOP_PREPARE, - /* Disable interrupts. */ - MULTI_STOP_DISABLE_IRQ, + /* Disable interrupts on CPUs not in ->active_cpus mask. */ + MULTI_STOP_DISABLE_IRQ_INACTIVE, + /* Disable interrupts on CPUs in ->active_cpus mask. */ + MULTI_STOP_DISABLE_IRQ_ACTIVE, /* Run the function */ MULTI_STOP_RUN, /* Exit */ @@ -165,13 +167,12 @@ static void ack_state(struct multi_stop_ set_state(msdata, msdata->state + 1); } - /* This is the cpu_stop function which stops the CPU. */ static int multi_cpu_stop(void *data) { struct multi_stop_data *msdata = data; enum multi_stop_state curstate = MULTI_STOP_NONE; - int cpu = smp_processor_id(), num_active_cpus, err = 0; + int cpu = smp_processor_id(), err = 0; unsigned long flags; bool is_active; @@ -181,13 +182,10 @@ static int multi_cpu_stop(void *data) */ local_save_flags(flags); - if (!msdata->active_cpus) { + if (!msdata->active_cpus) is_active = cpu == cpumask_first(cpu_online_mask); - num_active_cpus = 1; - } else { + else is_active = cpumask_test_cpu(cpu, msdata->active_cpus); - num_active_cpus = cpumask_weight(msdata->active_cpus); - } /* Simple state machine */ do { @@ -197,26 +195,23 @@ static int multi_cpu_stop(void *data) /* * In the case of CPU offline, we don't want the other CPUs to * send IPIs to the active_cpu (the one going offline) after it - * has entered the _DISABLE_IRQ state (because, then it will - * notice the IPIs only after it goes offline). So ensure that - * the active_cpu always follows the others while entering - * each subsequent state in this state-machine. - * - * msdata->thread_ack tracks the number of CPUs that are yet to - * move to the next state, during each transition. So make the - * active_cpu(s) wait until ->thread_ack indicates that the - * active_cpus are the only ones left to complete the transition. + * has disabled interrupts in the _DISABLE_IRQ state (because, + * then it will notice the IPIs only after it goes offline). So + * we split this state into _INACTIVE and _ACTIVE, and thereby + * ensure that the active_cpu disables interrupts only after + * the other CPUs do the same thing. */ - if (is_active) { - /* Wait until all the non-active threads ack the state */ - while (atomic_read(&msdata->thread_ack) > num_active_cpus) - cpu_relax(); - } if (msdata->state != curstate) { curstate = msdata->state; switch (curstate) { - case MULTI_STOP_DISABLE_IRQ: + case MULTI_STOP_DISABLE_IRQ_INACTIVE: + if (is_active) + break; + + /* Else, fall-through */ + + case MULTI_STOP_DISABLE_IRQ_ACTIVE: local_irq_disable(); hard_irq_disable(); break; _ Patches currently in -mm which might be from srivatsa.bhat@xxxxxxxxxxxxxxxxxx are smp-print-more-useful-debug-info-upon-receiving-ipi-on-an-offline-cpu.patch smp-print-more-useful-debug-info-upon-receiving-ipi-on-an-offline-cpu-fix.patch cpu-hotplug-stop-machine-plug-race-window-that-leads-to-ipi-to-offline-cpu.patch cpu-hotplug-stop-machine-plug-race-window-that-leads-to-ipi-to-offline-cpu-v3.patch linux-next.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html