Merge tag 'afs-next-20190628' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowel...
[linux-2.6-block.git] / kernel / sched / cpufreq_schedutil.c
index 962cf343f798f860654015b68aee5923d1ccf2bb..636ca6f88c8ee275efd664c553609c5121a5cb3f 100644 (file)
@@ -196,14 +196,17 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy,
  * based on the task model parameters and gives the minimal utilization
  * required to meet deadlines.
  */
-unsigned long schedutil_freq_util(int cpu, unsigned long util_cfs,
-                                 unsigned long max, enum schedutil_type type)
+unsigned long schedutil_cpu_util(int cpu, unsigned long util_cfs,
+                                unsigned long max, enum schedutil_type type,
+                                struct task_struct *p)
 {
        unsigned long dl_util, util, irq;
        struct rq *rq = cpu_rq(cpu);
 
-       if (type == FREQUENCY_UTIL && rt_rq_is_runnable(&rq->rt))
+       if (!IS_BUILTIN(CONFIG_UCLAMP_TASK) &&
+           type == FREQUENCY_UTIL && rt_rq_is_runnable(&rq->rt)) {
                return max;
+       }
 
        /*
         * Early check to see if IRQ/steal time saturates the CPU, can be
@@ -219,9 +222,16 @@ unsigned long schedutil_freq_util(int cpu, unsigned long util_cfs,
         * CFS tasks and we use the same metric to track the effective
         * utilization (PELT windows are synchronized) we can directly add them
         * to obtain the CPU's actual utilization.
+        *
+        * CFS and RT utilization can be boosted or capped, depending on
+        * utilization clamp constraints requested by currently RUNNABLE
+        * tasks.
+        * When there are no CFS RUNNABLE tasks, clamps are released and
+        * frequency will be gracefully reduced with the utilization decay.
         */
-       util = util_cfs;
-       util += cpu_util_rt(rq);
+       util = util_cfs + cpu_util_rt(rq);
+       if (type == FREQUENCY_UTIL)
+               util = uclamp_util_with(rq, util, p);
 
        dl_util = cpu_util_dl(rq);
 
@@ -276,12 +286,12 @@ static unsigned long sugov_get_util(struct sugov_cpu *sg_cpu)
 {
        struct rq *rq = cpu_rq(sg_cpu->cpu);
        unsigned long util = cpu_util_cfs(rq);
-       unsigned long max = arch_scale_cpu_capacity(NULL, sg_cpu->cpu);
+       unsigned long max = arch_scale_cpu_capacity(sg_cpu->cpu);
 
        sg_cpu->max = max;
        sg_cpu->bw_dl = cpu_bw_dl(rq);
 
-       return schedutil_freq_util(sg_cpu->cpu, util, max, FREQUENCY_UTIL);
+       return schedutil_cpu_util(sg_cpu->cpu, util, max, FREQUENCY_UTIL, NULL);
 }
 
 /**