create sysfs link from acpi device to sysdev for cpu
authorZhang Rui <rui.zhang@intel.com>
Tue, 29 Apr 2008 06:36:07 +0000 (02:36 -0400)
committerAndi Kleen <andi@basil.nowhere.org>
Wed, 16 Jul 2008 21:27:01 +0000 (23:27 +0200)
Sys I/F under acpi device node and sysdev device node are both
needed for cpu hot-removal. User space need this link so that
they know they are poking the sys I/F for the same cpu.
http://bugzilla.kernel.org/show_bug.cgi?id=9772

Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
drivers/acpi/processor_core.c

index 1c0008e..feddc8e 100644 (file)
@@ -621,7 +621,7 @@ static int __cpuinit acpi_processor_start(struct acpi_device *device)
        int result = 0;
        acpi_status status = AE_OK;
        struct acpi_processor *pr;
-
+       struct sys_device *sysdev;
 
        pr = acpi_driver_data(device);
 
@@ -652,6 +652,10 @@ static int __cpuinit acpi_processor_start(struct acpi_device *device)
        if (result)
                goto end;
 
+       sysdev = get_cpu_sysdev(pr->id);
+       if (sysfs_create_link(&device->dev.kobj, &sysdev->kobj, "sysdev"))
+               return -EFAULT;
+
        status = acpi_install_notify_handler(pr->handle, ACPI_DEVICE_NOTIFY,
                                             acpi_processor_notify, pr);
 
@@ -810,6 +814,8 @@ static int acpi_processor_remove(struct acpi_device *device, int type)
        status = acpi_remove_notify_handler(pr->handle, ACPI_DEVICE_NOTIFY,
                                            acpi_processor_notify);
 
+       sysfs_remove_link(&device->dev.kobj, "sysdev");
+
        acpi_processor_remove_fs(device);
 
        if (pr->cdev) {