When doing physical processor hotplug, all affected CPUs should be handled in atomic, shouldn't be disturbed by online/offline requests from CPU device's online sysfs interface. For example, it's fatal if a CPU is onlined through CPU device's online sysfs interface between the hotplug driver offlines all affected CPUs and powers the physical processor off. So temporarily reject online/offline requests from CPU device's online sysfs interface by setting the busy flag when doing physical processor hotplug. Signed-off-by: Jiang Liu <jiang.liu@xxxxxxxxxx> --- drivers/acpi/processor_driver.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index 447bd6d..51e3993 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c @@ -702,7 +702,7 @@ static int acpi_processor_pre_configure(struct acpi_device *device, if (result) goto out_unlock; BUG_ON((pr->id >= nr_cpu_ids) || (pr->id < 0)); - result = arch_register_cpu(pr->id, 0); + result = arch_register_cpu(pr->id, 1); if (result) goto out_unmap; @@ -755,10 +755,26 @@ static void acpi_processor_post_configure(struct acpi_device *device, if (!cpu_online(pr->id) && cpu_up(pr->id)) dev_warn(&device->dev, "fails to online CPU%d.\n", pr->id); + cpu_set_busy(pr->id, 0); } else if (cmd == ACPIHP_DEV_POST_CMD_ROLLBACK) acpi_processor_reset(device, pr); } +static int acpi_processor_pre_release(struct acpi_device *device, + struct acpihp_cancel_context *ctx) +{ + int result; + struct acpi_processor *pr; + + if (!device || !acpi_driver_data(device)) + return -EINVAL; + pr = acpi_driver_data(device); + + result = cpu_set_busy(pr->id, 1); + + return result ? -EBUSY : 0; +} + static int acpi_processor_release(struct acpi_device *device, struct acpihp_cancel_context *ctx) { @@ -783,9 +799,11 @@ static void acpi_processor_post_release(struct acpi_device *device, BUG_ON(!device || !acpi_driver_data(device)); pr = acpi_driver_data(device); - if (cmd == ACPIHP_DEV_POST_CMD_ROLLBACK) + if (cmd == ACPIHP_DEV_POST_CMD_ROLLBACK) { if (!cpu_online(pr->id)) cpu_up(pr->id); + cpu_set_busy(pr->id, 0); + } } static void acpi_processor_unconfigure(struct acpi_device *device) @@ -803,6 +821,7 @@ static struct acpihp_dev_ops acpi_processor_hp_ops = { .pre_configure = &acpi_processor_pre_configure, .configure = &acpi_processor_configure, .post_configure = &acpi_processor_post_configure, + .pre_release = &acpi_processor_pre_release, .release = &acpi_processor_release, .post_release = &acpi_processor_post_release, .unconfigure = &acpi_processor_unconfigure, -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html