diff options
Diffstat (limited to 'drivers/acpi/processor_driver.c')
-rw-r--r-- | drivers/acpi/processor_driver.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index bd4e5dca3ff7..a4352b88a331 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c | |||
@@ -852,8 +852,22 @@ static int acpi_processor_handle_eject(struct acpi_processor *pr) | |||
852 | if (cpu_online(pr->id)) | 852 | if (cpu_online(pr->id)) |
853 | cpu_down(pr->id); | 853 | cpu_down(pr->id); |
854 | 854 | ||
855 | get_online_cpus(); | ||
856 | /* | ||
857 | * The cpu might become online again at this point. So we check whether | ||
858 | * the cpu has been onlined or not. If the cpu became online, it means | ||
859 | * that someone wants to use the cpu. So acpi_processor_handle_eject() | ||
860 | * returns -EAGAIN. | ||
861 | */ | ||
862 | if (unlikely(cpu_online(pr->id))) { | ||
863 | put_online_cpus(); | ||
864 | pr_warn("Failed to remove CPU %d, because other task " | ||
865 | "brought the CPU back online\n", pr->id); | ||
866 | return -EAGAIN; | ||
867 | } | ||
855 | arch_unregister_cpu(pr->id); | 868 | arch_unregister_cpu(pr->id); |
856 | acpi_unmap_lsapic(pr->id); | 869 | acpi_unmap_lsapic(pr->id); |
870 | put_online_cpus(); | ||
857 | return (0); | 871 | return (0); |
858 | } | 872 | } |
859 | #else | 873 | #else |