diff options
| -rw-r--r-- | kernel/cpu.c | 5 |
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 | */ |
