diff options
Diffstat (limited to 'drivers/acpi/processor_driver.c')
| -rw-r--r-- | drivers/acpi/processor_driver.c | 14 | 
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index 8ae05ce1850..fce0066aa4a 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c @@ -535,8 +535,8 @@ static int __cpuinit acpi_processor_add(struct acpi_device *device)  		return -ENOMEM;  	if (!zalloc_cpumask_var(&pr->throttling.shared_cpu_map, GFP_KERNEL)) { -		kfree(pr); -		return -ENOMEM; +		result = -ENOMEM; +		goto err_free_pr;  	}  	pr->handle = device->handle; @@ -576,7 +576,7 @@ static int __cpuinit acpi_processor_add(struct acpi_device *device)  	dev = get_cpu_device(pr->id);  	if (sysfs_create_link(&device->dev.kobj, &dev->kobj, "sysdev")) {  		result = -EFAULT; -		goto err_free_cpumask; +		goto err_clear_processor;  	}  	/* @@ -594,9 +594,15 @@ static int __cpuinit acpi_processor_add(struct acpi_device *device)  err_remove_sysfs:  	sysfs_remove_link(&device->dev.kobj, "sysdev"); +err_clear_processor: +	/* +	 * processor_device_array is not cleared to allow checks for buggy BIOS +	 */  +	per_cpu(processors, pr->id) = NULL;  err_free_cpumask:  	free_cpumask_var(pr->throttling.shared_cpu_map); - +err_free_pr: +	kfree(pr);  	return result;  }  |