|
@@ -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;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -90,8 +91,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;
|
|
|
|
|
|
|
@@ -405,7 +409,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,
|
|
@@ -425,7 +429,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;
|
|
@@ -798,6 +803,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;
|
|
|
|
|
|
|
@@ -849,7 +855,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;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static struct cpufreq_governor schedutil_gov = {
|
|
static struct cpufreq_governor schedutil_gov = {
|