|
@@ -388,7 +388,7 @@ static int clamp_thread(void *arg)
|
|
|
int sleeptime;
|
|
|
unsigned long target_jiffies;
|
|
|
unsigned int guard;
|
|
|
- unsigned int compensation = 0;
|
|
|
+ unsigned int compensated_ratio;
|
|
|
int interval; /* jiffies to sleep for each attempt */
|
|
|
unsigned int duration_jiffies = msecs_to_jiffies(duration);
|
|
|
unsigned int window_size_now;
|
|
@@ -409,8 +409,11 @@ static int clamp_thread(void *arg)
|
|
|
* c-states, thus we need to compensate the injected idle ratio
|
|
|
* to achieve the actual target reported by the HW.
|
|
|
*/
|
|
|
- compensation = get_compensation(target_ratio);
|
|
|
- interval = duration_jiffies*100/(target_ratio+compensation);
|
|
|
+ compensated_ratio = target_ratio +
|
|
|
+ get_compensation(target_ratio);
|
|
|
+ if (compensated_ratio <= 0)
|
|
|
+ compensated_ratio = 1;
|
|
|
+ interval = duration_jiffies * 100 / compensated_ratio;
|
|
|
|
|
|
/* align idle time */
|
|
|
target_jiffies = roundup(jiffies, interval);
|
|
@@ -647,8 +650,8 @@ static int powerclamp_set_cur_state(struct thermal_cooling_device *cdev,
|
|
|
goto exit_set;
|
|
|
} else if (set_target_ratio > 0 && new_target_ratio == 0) {
|
|
|
pr_info("Stop forced idle injection\n");
|
|
|
- set_target_ratio = 0;
|
|
|
end_power_clamp();
|
|
|
+ set_target_ratio = 0;
|
|
|
} else /* adjust currently running */ {
|
|
|
set_target_ratio = new_target_ratio;
|
|
|
/* make new set_target_ratio visible to other cpus */
|