[COMMON] sched/rt: Initializing RT Task load
authorJohnlay Park <jonglae.park@samsung.com>
Mon, 26 Feb 2018 01:32:14 +0000 (10:32 +0900)
committerChungwoo Park <cww.park@samsung.com>
Mon, 21 May 2018 08:33:09 +0000 (17:33 +0900)
Change-Id: Ic59923ac76d690811fda9fc0228a2dea152948c9
Signed-off-by: Johnlay Park <jonglae.park@samsung.com>
kernel/sched/core.c
kernel/sched/rt.c
kernel/sched/sched.h

index ab6d57b537b34d1d0e4c8b0f03e1d8f96bc02b75..847bdfbd65f486ecc5dc67d6497c054f2c44156e 100644 (file)
@@ -2425,6 +2425,7 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p)
        }
 
        init_entity_runnable_average(&p->se);
+       init_rt_entity_runnable_average(&p->rt);
 
        /*
         * The child is not yet in the pid-hash so no cgroup attach races,
index 0ec3a6f29f72ab9977078001b97cbcb743bc956e..e3d6b2124ecc87dfd3b8398d828660d0a5b94ade 100644 (file)
@@ -216,6 +216,7 @@ int alloc_rt_sched_group(struct task_group *tg, struct task_group *parent)
                init_rt_rq(rt_rq);
                rt_rq->rt_runtime = tg->rt_bandwidth.rt_runtime;
                init_tg_rt_entry(tg, rt_rq, rt_se, i, parent->rt_se[i]);
+               init_rt_entity_runnable_average(rt_se);
        }
 
        return 1;
@@ -1651,6 +1652,30 @@ static void check_preempt_equal_prio(struct rq *rq, struct task_struct *p)
        resched_curr(rq);
 }
 
+/* Give new sched_entity start runnable values to heavy its load in infant time */
+void init_rt_entity_runnable_average(struct sched_rt_entity *rt_se)
+{
+       struct sched_avg *sa = &rt_se->avg;
+
+       sa->last_update_time = 0;
+
+       sa->period_contrib = 1023;
+
+       /*
+        * Tasks are intialized with zero load.
+        * Load is not actually used by RT, but can be inherited into fair task.
+        */
+       sa->load_avg = 0;
+       sa->load_sum = 0;
+       /*
+        * At this point, util_avg won't be used in select_task_rq_rt anyway
+        */
+       sa->util_avg = 0;
+       sa->util_sum = 0;
+       /* when this task enqueue'ed, it will contribute to its cfs_rq's load_avg */
+}
+#else
+void init_rt_entity_runnable_average(struct sched_rt_entity *rt_se) { }
 #endif /* CONFIG_SMP */
 
 /*
index c9447be011f9a4effbadfb1b39e65328feb209be..70f3c87f73b8b71113ec4c2afa03a382e7f515ee 100644 (file)
@@ -1653,6 +1653,7 @@ extern void init_dl_rq_bw_ratio(struct dl_rq *dl_rq);
 unsigned long to_ratio(u64 period, u64 runtime);
 
 extern void init_entity_runnable_average(struct sched_entity *se);
+extern void init_rt_entity_runnable_average(struct sched_rt_entity *rt_se);
 extern void post_init_entity_util_avg(struct sched_entity *se);
 
 #ifdef CONFIG_NO_HZ_FULL