aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/cpu.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c
index 63aa50d7ce1e..2227b58734a7 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -306,7 +306,6 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen)
306 __func__, cpu); 306 __func__, cpu);
307 goto out_release; 307 goto out_release;
308 } 308 }
309 smpboot_park_threads(cpu);
310 309
311 /* 310 /*
312 * By now we've cleared cpu_active_mask, wait for all preempt-disabled 311 * 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)
315 * 314 *
316 * For CONFIG_PREEMPT we have preemptible RCU and its sync_rcu() might 315 * For CONFIG_PREEMPT we have preemptible RCU and its sync_rcu() might
317 * not imply sync_sched(), so explicitly call both. 316 * not imply sync_sched(), so explicitly call both.
317 *
318 * Do sync before park smpboot threads to take care the rcu boost case.
318 */ 319 */
319#ifdef CONFIG_PREEMPT 320#ifdef CONFIG_PREEMPT
320 synchronize_sched(); 321 synchronize_sched();
321#endif 322#endif
322 synchronize_rcu(); 323 synchronize_rcu();
323 324
325 smpboot_park_threads(cpu);
326
324 /* 327 /*
325 * So now all preempt/rcu users must observe !cpu_active(). 328 * So now all preempt/rcu users must observe !cpu_active().
326 */ 329 */