]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
cpufreq: ondemand: Replace down_differential tuner with adj_up_threshold
authorStratos Karafotis <stratosk@semaphore.gr>
Wed, 6 Feb 2013 12:34:00 +0000 (13:34 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sat, 9 Feb 2013 00:18:47 +0000 (01:18 +0100)
In order to avoid the calculation of up_threshold - down_differential
every time that the frequency must be decreased, we replace the
down_differential tuner with the adj_up_threshold which keeps the
difference across multiple checks.

Update the adj_up_threshold only when the up_theshold is also updated.

Signed-off-by: Stratos Karafotis <stratosk@semaphore.gr>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpufreq/cpufreq_governor.h
drivers/cpufreq/cpufreq_ondemand.c

index 16314b65ca67c9816532ddea15c5775ecae1f320..d2ac911506006be9e1c77b1e57853828c33fd99a 100644 (file)
@@ -109,7 +109,7 @@ struct od_dbs_tuners {
        unsigned int sampling_rate;
        unsigned int sampling_down_factor;
        unsigned int up_threshold;
-       unsigned int down_differential;
+       unsigned int adj_up_threshold;
        unsigned int powersave_bias;
        unsigned int io_is_busy;
 };
index f38b8da601284195dd1088c180bf14b38439794e..09b27ae6576fbf9f2e26642361747a32d6055aa7 100644 (file)
@@ -47,7 +47,8 @@ static struct cpufreq_governor cpufreq_gov_ondemand;
 static struct od_dbs_tuners od_tuners = {
        .up_threshold = DEF_FREQUENCY_UP_THRESHOLD,
        .sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR,
-       .down_differential = DEF_FREQUENCY_DOWN_DIFFERENTIAL,
+       .adj_up_threshold = DEF_FREQUENCY_UP_THRESHOLD -
+                           DEF_FREQUENCY_DOWN_DIFFERENTIAL,
        .ignore_nice = 0,
        .powersave_bias = 0,
 };
@@ -192,11 +193,9 @@ static void od_check_cpu(int cpu, unsigned int load_freq)
         * support the current CPU usage without triggering the up policy. To be
         * safe, we focus 10 points under the threshold.
         */
-       if (load_freq < (od_tuners.up_threshold - od_tuners.down_differential) *
-                       policy->cur) {
+       if (load_freq < od_tuners.adj_up_threshold * policy->cur) {
                unsigned int freq_next;
-               freq_next = load_freq / (od_tuners.up_threshold -
-                               od_tuners.down_differential);
+               freq_next = load_freq / od_tuners.adj_up_threshold;
 
                /* No longer fully busy, reset rate_mult */
                dbs_info->rate_mult = 1;
@@ -359,6 +358,10 @@ static ssize_t store_up_threshold(struct kobject *a, struct attribute *b,
                        input < MIN_FREQUENCY_UP_THRESHOLD) {
                return -EINVAL;
        }
+       /* Calculate the new adj_up_threshold */
+       od_tuners.adj_up_threshold += input;
+       od_tuners.adj_up_threshold -= od_tuners.up_threshold;
+
        od_tuners.up_threshold = input;
        return count;
 }
@@ -515,7 +518,8 @@ static int __init cpufreq_gov_dbs_init(void)
        if (idle_time != -1ULL) {
                /* Idle micro accounting is supported. Use finer thresholds */
                od_tuners.up_threshold = MICRO_FREQUENCY_UP_THRESHOLD;
-               od_tuners.down_differential = MICRO_FREQUENCY_DOWN_DIFFERENTIAL;
+               od_tuners.adj_up_threshold = MICRO_FREQUENCY_UP_THRESHOLD -
+                                            MICRO_FREQUENCY_DOWN_DIFFERENTIAL;
                /*
                 * In nohz/micro accounting case we set the minimum frequency
                 * not depending on HZ, but fixed (very low). The deferred