Commit 6acce3ef8:

        sched: Remove get_online_cpus() usage

try to do sync_sched/rcu() inside _cpu_down() but trigger:

        INFO: task swapper/0:1 blocked for more than 120 seconds.
        ...
        [<ffffffff811263dc>] synchronize_rcu+0x2c/0x30
        [<ffffffff81d1bd82>] _cpu_down+0x2b2/0x340
        ...

It was caused by that in rcu boost case, we rely on smpboot thread to
finish the rcu callback, which has already parked before sync in here
and lead to the endless sync_sched/rcu().

This patch exchange the sequence of smpboot_park_threads() and
sync_sched/rcu() to fix the BUG.

Cc: Peter Zijlstra <pet...@infradead.org>
Cc: Ingo Molnar <mi...@kernel.org>
Reported-by: Fengguang Wu <fengguang...@intel.com>
Tested-by: Fengguang Wu <fengguang...@intel.com>
Signed-off-by: Michael Wang <wang...@linux.vnet.ibm.com>
---
 kernel/cpu.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/kernel/cpu.c b/kernel/cpu.c
index 63aa50d..2227b58 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -306,7 +306,6 @@ static int __ref _cpu_down(unsigned int cpu, int 
tasks_frozen)
                                __func__, cpu);
                goto out_release;
        }
-       smpboot_park_threads(cpu);
 
        /*
         * By now we've cleared cpu_active_mask, wait for all preempt-disabled
@@ -315,12 +314,16 @@ static int __ref _cpu_down(unsigned int cpu, int 
tasks_frozen)
         *
         * For CONFIG_PREEMPT we have preemptible RCU and its sync_rcu() might
         * not imply sync_sched(), so explicitly call both.
+        *
+        * Do sync before park smpboot threads to take care the rcu boost case.
         */
 #ifdef CONFIG_PREEMPT
        synchronize_sched();
 #endif
        synchronize_rcu();
 
+       smpboot_park_threads(cpu);
+
        /*
         * So now all preempt/rcu users must observe !cpu_active().
         */
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to