Commit a3ee2477 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branch 'pm-cpufreq'

* pm-cpufreq:
  cpufreq: schedutil: Don't skip freq update when limits change
  cpufreq: dev_pm_qos_update_request() can return 1 on success
parents 4eaefe8c 600f5bad
...@@ -2528,7 +2528,7 @@ static int cpufreq_boost_set_sw(int state) ...@@ -2528,7 +2528,7 @@ static int cpufreq_boost_set_sw(int state)
} }
ret = dev_pm_qos_update_request(policy->max_freq_req, policy->max); ret = dev_pm_qos_update_request(policy->max_freq_req, policy->max);
if (ret) if (ret < 0)
break; break;
} }
......
...@@ -40,6 +40,7 @@ struct sugov_policy { ...@@ -40,6 +40,7 @@ struct sugov_policy {
struct task_struct *thread; struct task_struct *thread;
bool work_in_progress; bool work_in_progress;
bool limits_changed;
bool need_freq_update; bool need_freq_update;
}; };
...@@ -89,8 +90,11 @@ static bool sugov_should_update_freq(struct sugov_policy *sg_policy, u64 time) ...@@ -89,8 +90,11 @@ static bool sugov_should_update_freq(struct sugov_policy *sg_policy, u64 time)
!cpufreq_this_cpu_can_update(sg_policy->policy)) !cpufreq_this_cpu_can_update(sg_policy->policy))
return false; return false;
if (unlikely(sg_policy->need_freq_update)) if (unlikely(sg_policy->limits_changed)) {
sg_policy->limits_changed = false;
sg_policy->need_freq_update = true;
return true; return true;
}
delta_ns = time - sg_policy->last_freq_update_time; delta_ns = time - sg_policy->last_freq_update_time;
...@@ -437,7 +441,7 @@ static inline bool sugov_cpu_is_busy(struct sugov_cpu *sg_cpu) { return false; } ...@@ -437,7 +441,7 @@ static inline bool sugov_cpu_is_busy(struct sugov_cpu *sg_cpu) { return false; }
static inline void ignore_dl_rate_limit(struct sugov_cpu *sg_cpu, struct sugov_policy *sg_policy) static inline void ignore_dl_rate_limit(struct sugov_cpu *sg_cpu, struct sugov_policy *sg_policy)
{ {
if (cpu_bw_dl(cpu_rq(sg_cpu->cpu)) > sg_cpu->bw_dl) if (cpu_bw_dl(cpu_rq(sg_cpu->cpu)) > sg_cpu->bw_dl)
sg_policy->need_freq_update = true; sg_policy->limits_changed = true;
} }
static void sugov_update_single(struct update_util_data *hook, u64 time, static void sugov_update_single(struct update_util_data *hook, u64 time,
...@@ -457,7 +461,8 @@ static void sugov_update_single(struct update_util_data *hook, u64 time, ...@@ -457,7 +461,8 @@ static void sugov_update_single(struct update_util_data *hook, u64 time,
if (!sugov_should_update_freq(sg_policy, time)) if (!sugov_should_update_freq(sg_policy, time))
return; return;
busy = sugov_cpu_is_busy(sg_cpu); /* Limits may have changed, don't skip frequency update */
busy = !sg_policy->need_freq_update && sugov_cpu_is_busy(sg_cpu);
util = sugov_get_util(sg_cpu); util = sugov_get_util(sg_cpu);
max = sg_cpu->max; max = sg_cpu->max;
...@@ -831,6 +836,7 @@ static int sugov_start(struct cpufreq_policy *policy) ...@@ -831,6 +836,7 @@ static int sugov_start(struct cpufreq_policy *policy)
sg_policy->last_freq_update_time = 0; sg_policy->last_freq_update_time = 0;
sg_policy->next_freq = 0; sg_policy->next_freq = 0;
sg_policy->work_in_progress = false; sg_policy->work_in_progress = false;
sg_policy->limits_changed = false;
sg_policy->need_freq_update = false; sg_policy->need_freq_update = false;
sg_policy->cached_raw_freq = 0; sg_policy->cached_raw_freq = 0;
...@@ -879,7 +885,7 @@ static void sugov_limits(struct cpufreq_policy *policy) ...@@ -879,7 +885,7 @@ static void sugov_limits(struct cpufreq_policy *policy)
mutex_unlock(&sg_policy->work_lock); mutex_unlock(&sg_policy->work_lock);
} }
sg_policy->need_freq_update = true; sg_policy->limits_changed = true;
} }
struct cpufreq_governor schedutil_gov = { struct cpufreq_governor schedutil_gov = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment