sched/fair: Don't init util/runnable_avg for !fair task
authorChengming Zhou <zhouchengming@bytedance.com>
Thu, 18 Aug 2022 12:48:05 +0000 (20:48 +0800)
committerPeter Zijlstra <peterz@infradead.org>
Tue, 23 Aug 2022 09:01:20 +0000 (11:01 +0200)
post_init_entity_util_avg() init task util_avg according to the cpu util_avg
at the time of fork, which will decay when switched_to_fair() some time later,
we'd better to not set them at all in the case of !fair task.

Suggested-by: Vincent Guittot <vincent.guittot@linaro.org>
Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>
Link: https://lore.kernel.org/r/20220818124805.601-10-zhouchengming@bytedance.com
kernel/sched/fair.c

index ef325b561df4cba388938b1221e0b46d0daf85c0..e8c1b889dcbbe2c912cdcb2e60a8dc7ffdd29a26 100644 (file)
@@ -833,20 +833,6 @@ void post_init_entity_util_avg(struct task_struct *p)
        long cpu_scale = arch_scale_cpu_capacity(cpu_of(rq_of(cfs_rq)));
        long cap = (long)(cpu_scale - cfs_rq->avg.util_avg) / 2;
 
-       if (cap > 0) {
-               if (cfs_rq->avg.util_avg != 0) {
-                       sa->util_avg  = cfs_rq->avg.util_avg * se->load.weight;
-                       sa->util_avg /= (cfs_rq->avg.load_avg + 1);
-
-                       if (sa->util_avg > cap)
-                               sa->util_avg = cap;
-               } else {
-                       sa->util_avg = cap;
-               }
-       }
-
-       sa->runnable_avg = sa->util_avg;
-
        if (p->sched_class != &fair_sched_class) {
                /*
                 * For !fair tasks do:
@@ -861,6 +847,20 @@ void post_init_entity_util_avg(struct task_struct *p)
                se->avg.last_update_time = cfs_rq_clock_pelt(cfs_rq);
                return;
        }
+
+       if (cap > 0) {
+               if (cfs_rq->avg.util_avg != 0) {
+                       sa->util_avg  = cfs_rq->avg.util_avg * se->load.weight;
+                       sa->util_avg /= (cfs_rq->avg.load_avg + 1);
+
+                       if (sa->util_avg > cap)
+                               sa->util_avg = cap;
+               } else {
+                       sa->util_avg = cap;
+               }
+       }
+
+       sa->runnable_avg = sa->util_avg;
 }
 
 #else /* !CONFIG_SMP */