diff options
Diffstat (limited to 'drivers/acpi/processor_driver.c')
| -rw-r--r-- | drivers/acpi/processor_driver.c | 21 | 
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index e534ba66d5b..4fcbd670415 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c @@ -41,8 +41,6 @@  #include "internal.h" -#define PREFIX "ACPI: " -  #define ACPI_PROCESSOR_NOTIFY_PERFORMANCE 0x80  #define ACPI_PROCESSOR_NOTIFY_POWER	0x81  #define ACPI_PROCESSOR_NOTIFY_THROTTLING	0x82 @@ -123,6 +121,13 @@ static int acpi_cpu_soft_notify(struct notifier_block *nfb,  	struct acpi_processor *pr = per_cpu(processors, cpu);  	struct acpi_device *device; +	/* +	 * CPU_STARTING and CPU_DYING must not sleep. Return here since +	 * acpi_bus_get_device() may sleep. +	 */ +	if (action == CPU_STARTING || action == CPU_DYING) +		return NOTIFY_DONE; +  	if (!pr || acpi_bus_get_device(pr->handle, &device))  		return NOTIFY_DONE; @@ -153,8 +158,7 @@ static int acpi_cpu_soft_notify(struct notifier_block *nfb,  	return NOTIFY_OK;  } -static struct notifier_block __refdata acpi_cpu_notifier = -{ +static struct notifier_block __refdata acpi_cpu_notifier = {  	    .notifier_call = acpi_cpu_soft_notify,  }; @@ -172,7 +176,6 @@ static int __acpi_processor_start(struct acpi_device *device)  #ifdef CONFIG_CPU_FREQ  	acpi_processor_ppc_has_changed(pr, 0); -	acpi_processor_load_module(pr);  #endif  	acpi_processor_get_throttling_info(pr); @@ -226,9 +229,9 @@ static int __acpi_processor_start(struct acpi_device *device)  static int acpi_processor_start(struct device *dev)  { -	struct acpi_device *device; +	struct acpi_device *device = ACPI_COMPANION(dev); -	if (acpi_bus_get_device(ACPI_HANDLE(dev), &device)) +	if (!device)  		return -ENODEV;  	return __acpi_processor_start(device); @@ -236,10 +239,10 @@ static int acpi_processor_start(struct device *dev)  static int acpi_processor_stop(struct device *dev)  { -	struct acpi_device *device; +	struct acpi_device *device = ACPI_COMPANION(dev);  	struct acpi_processor *pr; -	if (acpi_bus_get_device(ACPI_HANDLE(dev), &device)) +	if (!device)  		return 0;  	acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY,  | 
