aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/processor_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/processor_driver.c')
-rw-r--r--drivers/acpi/processor_driver.c14
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