diff options
| -rw-r--r-- | kernel/cpu.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c index a1ac7ea245d7..033603c1d7c3 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
| @@ -301,6 +301,16 @@ int __ref cpu_down(unsigned int cpu) | |||
| 301 | 301 | ||
| 302 | cpu_clear(cpu, cpu_active_map); | 302 | cpu_clear(cpu, cpu_active_map); |
| 303 | 303 | ||
| 304 | /* | ||
| 305 | * Make sure the all cpus did the reschedule and are not | ||
| 306 | * using stale version of the cpu_active_map. | ||
| 307 | * This is not strictly necessary becuase stop_machine() | ||
| 308 | * that we run down the line already provides the required | ||
| 309 | * synchronization. But it's really a side effect and we do not | ||
| 310 | * want to depend on the innards of the stop_machine here. | ||
| 311 | */ | ||
| 312 | synchronize_sched(); | ||
| 313 | |||
| 304 | err = _cpu_down(cpu, 0); | 314 | err = _cpu_down(cpu, 0); |
| 305 | 315 | ||
| 306 | if (cpu_online(cpu)) | 316 | if (cpu_online(cpu)) |
