summaryrefslogtreecommitdiffstats
path: root/drivers/idle
diff options
context:
space:
mode:
authorRichard Cochran <rcochran@linutronix.de>2016-04-06 17:00:52 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-04-07 16:10:56 -0400
commite9df69ccd1322e87eee10f28036fad9e6c71f8dd (patch)
tree0f51f52ff6d92a502dddb07814cdf19547030263 /drivers/idle
parent51319918bcc31f901646fc66348d41cf74ee0566 (diff)
intel_idle: Fix dangling registration on error path.
In the module_init() method, if the per-CPU allocation fails, then the active cpuidle registration is not cleaned up. This patch fixes the issue by attempting the allocation before registration, and then cleaning it up again on registration failure. Signed-off-by: Richard Cochran <rcochran@linutronix.de> Signed-off-by: Len Brown <len.brown@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/idle')
-rw-r--r--drivers/idle/intel_idle.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
index 4a1de3dcbf85..5dd741ff4de3 100644
--- a/drivers/idle/intel_idle.c
+++ b/drivers/idle/intel_idle.c
@@ -1210,19 +1210,20 @@ static int __init intel_idle_init(void)
1210 if (retval) 1210 if (retval)
1211 return retval; 1211 return retval;
1212 1212
1213 intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device);
1214 if (intel_idle_cpuidle_devices == NULL)
1215 return -ENOMEM;
1216
1213 intel_idle_cpuidle_driver_init(); 1217 intel_idle_cpuidle_driver_init();
1214 retval = cpuidle_register_driver(&intel_idle_driver); 1218 retval = cpuidle_register_driver(&intel_idle_driver);
1215 if (retval) { 1219 if (retval) {
1216 struct cpuidle_driver *drv = cpuidle_get_driver(); 1220 struct cpuidle_driver *drv = cpuidle_get_driver();
1217 printk(KERN_DEBUG PREFIX "intel_idle yielding to %s", 1221 printk(KERN_DEBUG PREFIX "intel_idle yielding to %s",
1218 drv ? drv->name : "none"); 1222 drv ? drv->name : "none");
1223 free_percpu(intel_idle_cpuidle_devices);
1219 return retval; 1224 return retval;
1220 } 1225 }
1221 1226
1222 intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device);
1223 if (intel_idle_cpuidle_devices == NULL)
1224 return -ENOMEM;
1225
1226 cpu_notifier_register_begin(); 1227 cpu_notifier_register_begin();
1227 1228
1228 for_each_online_cpu(i) { 1229 for_each_online_cpu(i) {