aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2017-03-22 13:32:47 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2017-03-23 21:57:22 -0400
commit38d4ea229d25d30be6bf41bcd6cd663a587866ca (patch)
treee42f08d1d926e1e41df166d863d132d75be24c5b
parentb7eaf1aab9f8bd2e49fceed77ebc66c1b5800718 (diff)
cpufreq: schedutil: Trace frequency only if it has changed
sugov_update_commit() calls trace_cpu_frequency() to record the current CPU frequency if it has not changed in the fast switch case to prevent utilities from getting confused (they may report that the CPU is idle if the frequency has not been recorded for too long, for example). However, that may cause the tracepoint to be triggered quite often for no real reason (if the frequency doesn't change, we will not modify the last update time stamp and governor computations may run again shortly when that happens), so don't do that (arguably, it is done to work around a utilities bug anyway). That allows code duplication in sugov_update_commit() to be reduced somewhat too. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
-rw-r--r--kernel/sched/cpufreq_schedutil.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c
index c1ffb5dc8af6..1054f868d95c 100644
--- a/kernel/sched/cpufreq_schedutil.c
+++ b/kernel/sched/cpufreq_schedutil.c
@@ -98,22 +98,20 @@ static void sugov_update_commit(struct sugov_policy *sg_policy, u64 time,
98{ 98{
99 struct cpufreq_policy *policy = sg_policy->policy; 99 struct cpufreq_policy *policy = sg_policy->policy;
100 100
101 if (sg_policy->next_freq == next_freq)
102 return;
103
104 sg_policy->next_freq = next_freq;
105 sg_policy->last_freq_update_time = time;
106
101 if (policy->fast_switch_enabled) { 107 if (policy->fast_switch_enabled) {
102 if (sg_policy->next_freq == next_freq) {
103 trace_cpu_frequency(policy->cur, smp_processor_id());
104 return;
105 }
106 sg_policy->next_freq = next_freq;
107 sg_policy->last_freq_update_time = time;
108 next_freq = cpufreq_driver_fast_switch(policy, next_freq); 108 next_freq = cpufreq_driver_fast_switch(policy, next_freq);
109 if (next_freq == CPUFREQ_ENTRY_INVALID) 109 if (next_freq == CPUFREQ_ENTRY_INVALID)
110 return; 110 return;
111 111
112 policy->cur = next_freq; 112 policy->cur = next_freq;
113 trace_cpu_frequency(next_freq, smp_processor_id()); 113 trace_cpu_frequency(next_freq, smp_processor_id());
114 } else if (sg_policy->next_freq != next_freq) { 114 } else {
115 sg_policy->next_freq = next_freq;
116 sg_policy->last_freq_update_time = time;
117 sg_policy->work_in_progress = true; 115 sg_policy->work_in_progress = true;
118 irq_work_queue(&sg_policy->irq_work); 116 irq_work_queue(&sg_policy->irq_work);
119 } 117 }