diff options
Diffstat (limited to 'kernel/cpu.c')
| -rw-r--r-- | kernel/cpu.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c index 27dd3ee47099..272254f20d97 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
| @@ -58,8 +58,8 @@ void unlock_cpu_hotplug(void) | |||
| 58 | recursive_depth--; | 58 | recursive_depth--; |
| 59 | return; | 59 | return; |
| 60 | } | 60 | } |
| 61 | mutex_unlock(&cpu_bitmask_lock); | ||
| 62 | recursive = NULL; | 61 | recursive = NULL; |
| 62 | mutex_unlock(&cpu_bitmask_lock); | ||
| 63 | } | 63 | } |
| 64 | EXPORT_SYMBOL_GPL(unlock_cpu_hotplug); | 64 | EXPORT_SYMBOL_GPL(unlock_cpu_hotplug); |
| 65 | 65 | ||
| @@ -150,18 +150,18 @@ static int _cpu_down(unsigned int cpu) | |||
| 150 | p = __stop_machine_run(take_cpu_down, NULL, cpu); | 150 | p = __stop_machine_run(take_cpu_down, NULL, cpu); |
| 151 | mutex_unlock(&cpu_bitmask_lock); | 151 | mutex_unlock(&cpu_bitmask_lock); |
| 152 | 152 | ||
| 153 | if (IS_ERR(p)) { | 153 | if (IS_ERR(p) || cpu_online(cpu)) { |
| 154 | /* CPU didn't die: tell everyone. Can't complain. */ | 154 | /* CPU didn't die: tell everyone. Can't complain. */ |
| 155 | if (raw_notifier_call_chain(&cpu_chain, CPU_DOWN_FAILED, | 155 | if (raw_notifier_call_chain(&cpu_chain, CPU_DOWN_FAILED, |
| 156 | (void *)(long)cpu) == NOTIFY_BAD) | 156 | (void *)(long)cpu) == NOTIFY_BAD) |
| 157 | BUG(); | 157 | BUG(); |
| 158 | 158 | ||
| 159 | err = PTR_ERR(p); | 159 | if (IS_ERR(p)) { |
| 160 | goto out_allowed; | 160 | err = PTR_ERR(p); |
| 161 | } | 161 | goto out_allowed; |
| 162 | 162 | } | |
| 163 | if (cpu_online(cpu)) | ||
| 164 | goto out_thread; | 163 | goto out_thread; |
| 164 | } | ||
| 165 | 165 | ||
| 166 | /* Wait for it to sleep (leaving idle task). */ | 166 | /* Wait for it to sleep (leaving idle task). */ |
| 167 | while (!idle_cpu(cpu)) | 167 | while (!idle_cpu(cpu)) |
