|
@@ -758,21 +758,39 @@ static int powerclamp_init(void)
|
|
/* probe cpu features and ids here */
|
|
/* probe cpu features and ids here */
|
|
retval = powerclamp_probe();
|
|
retval = powerclamp_probe();
|
|
if (retval)
|
|
if (retval)
|
|
- return retval;
|
|
|
|
|
|
+ goto exit_free;
|
|
|
|
+
|
|
/* set default limit, maybe adjusted during runtime based on feedback */
|
|
/* set default limit, maybe adjusted during runtime based on feedback */
|
|
window_size = 2;
|
|
window_size = 2;
|
|
register_hotcpu_notifier(&powerclamp_cpu_notifier);
|
|
register_hotcpu_notifier(&powerclamp_cpu_notifier);
|
|
|
|
+
|
|
powerclamp_thread = alloc_percpu(struct task_struct *);
|
|
powerclamp_thread = alloc_percpu(struct task_struct *);
|
|
|
|
+ if (!powerclamp_thread) {
|
|
|
|
+ retval = -ENOMEM;
|
|
|
|
+ goto exit_unregister;
|
|
|
|
+ }
|
|
|
|
+
|
|
cooling_dev = thermal_cooling_device_register("intel_powerclamp", NULL,
|
|
cooling_dev = thermal_cooling_device_register("intel_powerclamp", NULL,
|
|
&powerclamp_cooling_ops);
|
|
&powerclamp_cooling_ops);
|
|
- if (IS_ERR(cooling_dev))
|
|
|
|
- return -ENODEV;
|
|
|
|
|
|
+ if (IS_ERR(cooling_dev)) {
|
|
|
|
+ retval = -ENODEV;
|
|
|
|
+ goto exit_free_thread;
|
|
|
|
+ }
|
|
|
|
|
|
if (!duration)
|
|
if (!duration)
|
|
duration = jiffies_to_msecs(DEFAULT_DURATION_JIFFIES);
|
|
duration = jiffies_to_msecs(DEFAULT_DURATION_JIFFIES);
|
|
|
|
+
|
|
powerclamp_create_debug_files();
|
|
powerclamp_create_debug_files();
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
|
+
|
|
|
|
+exit_free_thread:
|
|
|
|
+ free_percpu(powerclamp_thread);
|
|
|
|
+exit_unregister:
|
|
|
|
+ unregister_hotcpu_notifier(&powerclamp_cpu_notifier);
|
|
|
|
+exit_free:
|
|
|
|
+ kfree(cpu_clamping_mask);
|
|
|
|
+ return retval;
|
|
}
|
|
}
|
|
module_init(powerclamp_init);
|
|
module_init(powerclamp_init);
|
|
|
|
|