cpufreq: Don't skip frequency validation for has_target() drivers
authorViresh Kumar <viresh.kumar@linaro.org>
Fri, 28 Jun 2019 05:16:55 +0000 (10:46 +0530)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 28 Jun 2019 08:16:14 +0000 (10:16 +0200)
CPUFREQ_CONST_LOOPS was introduced in a very old commit from pre-2.6
kernel release by commit 6a4a93f9c0d5 ("[CPUFREQ] Fix 'out of sync'
issue").

Basically, that commit does two things:

 - It adds the frequency verification code (which is quite similar to
   what we have today as well).

 - And it sets the CPUFREQ_CONST_LOOPS flag only for setpolicy drivers,
   rightly so based on the code we had then. The idea was to avoid
   frequency validation for setpolicy drivers as the cpufreq core doesn't
   know what frequency the hardware is running at and so no point in
   doing frequency verification.

The problem happened when we started to use the same CPUFREQ_CONST_LOOPS
flag for constant loops-per-jiffy thing as well and many has_target()
drivers started using the same flag and unknowingly skipped the
verification of frequency. There is no logical reason behind skipping
frequency validation because of the presence of CPUFREQ_CONST_LOOPS
flag otherwise.

Fix this issue by skipping frequency validation only for setpolicy
drivers and always doing it for has_target() drivers irrespective of
the presence or absence of CPUFREQ_CONST_LOOPS flag.

cpufreq_notify_transition() is only called for has_target() type driver
and not for set_policy type, and the check is simply redundant. Remove
it as well.

Also remove () around freq comparison statement as they aren't required
and checkpatch also warns for them.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpufreq/cpufreq.c

index 555a626464910b7256eeed188ab816a453da43ab..2930065f78a4bae78bf76e41071b333f08bf4b63 100644 (file)
@@ -359,12 +359,10 @@ static void cpufreq_notify_transition(struct cpufreq_policy *policy,
                 * which is not equal to what the cpufreq core thinks is
                 * "old frequency".
                 */
-               if (!(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
-                       if (policy->cur && (policy->cur != freqs->old)) {
-                               pr_debug("Warning: CPU frequency is %u, cpufreq assumed %u kHz\n",
-                                        freqs->old, policy->cur);
-                               freqs->old = policy->cur;
-                       }
+               if (policy->cur && policy->cur != freqs->old) {
+                       pr_debug("Warning: CPU frequency is %u, cpufreq assumed %u kHz\n",
+                                freqs->old, policy->cur);
+                       freqs->old = policy->cur;
                }
 
                srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
@@ -1616,8 +1614,7 @@ static unsigned int __cpufreq_get(struct cpufreq_policy *policy)
        if (policy->fast_switch_enabled)
                return ret_freq;
 
-       if (ret_freq && policy->cur &&
-               !(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
+       if (has_target() && ret_freq && policy->cur) {
                /* verify no discrepancy between actual and
                                        saved value exists */
                if (unlikely(ret_freq != policy->cur)) {