From 699ae5e368fd4cdbd311c42ef94a11340c8ee98e Mon Sep 17 00:00:00 2001 From: Daeyeong Lee Date: Mon, 3 Sep 2018 14:45:36 +0900 Subject: [PATCH] [COMMON] sched: ems: Modify ontime migration to apply to each cgroup individually. Change-Id: I268c50933dbe11b81c89857c721745df3bf01b69 Signed-off-by: Daeyeong Lee --- kernel/sched/ems/ontime.c | 20 ++++++++++++++---- kernel/sched/tune.c | 44 +++++++++++++++++++++++++++++++++++++++ kernel/sched/tune.h | 2 ++ 3 files changed, 62 insertions(+), 4 deletions(-) diff --git a/kernel/sched/ems/ontime.c b/kernel/sched/ems/ontime.c index 853fd3fc2c6b..a8326a20cad2 100644 --- a/kernel/sched/ems/ontime.c +++ b/kernel/sched/ems/ontime.c @@ -239,10 +239,12 @@ ontime_pick_heavy_task(struct sched_entity *se, int *boost_migration) *boost_migration = 1; return p; } - if (ontime_load_avg(p) >= get_upper_boundary(task_cpu(p))) { - heaviest_task = p; - max_util_avg = ontime_load_avg(p); - *boost_migration = 0; + if (schedtune_ontime_en(p)) { + if (ontime_load_avg(p) >= get_upper_boundary(task_cpu(p))) { + heaviest_task = p; + max_util_avg = ontime_load_avg(p); + *boost_migration = 0; + } } se = __pick_first_entity(se->cfs_rq); @@ -258,6 +260,9 @@ ontime_pick_heavy_task(struct sched_entity *se, int *boost_migration) break; } + if (!schedtune_ontime_en(p)) + goto next_entity; + if (ontime_load_avg(p) < get_upper_boundary(task_cpu(p))) goto next_entity; @@ -528,6 +533,10 @@ int ontime_task_wakeup(struct task_struct *p, int sync) struct cpumask fit_cpus; int dst_cpu, src_cpu = task_cpu(p); + /* If this task is not allowed to ontime, do not ontime wakeup */ + if (!schedtune_ontime_en(p)) + return -1; + /* When wakeup task is on ontime migrating, do not ontime wakeup */ if (ontime_of(p)->migrating == 1) return -1; @@ -565,6 +574,9 @@ int ontime_can_migration(struct task_struct *p, int dst_cpu) { int src_cpu = task_cpu(p); + if (!schedtune_ontime_en(p)) + return true; + if (ontime_of(p)->migrating == 1) { trace_ems_ontime_check_migrate(p, dst_cpu, false, "on migrating"); return false; diff --git a/kernel/sched/tune.c b/kernel/sched/tune.c index 0a8c5c76bc18..293011d3a825 100644 --- a/kernel/sched/tune.c +++ b/kernel/sched/tune.c @@ -43,6 +43,9 @@ struct schedtune { /* Hint to group tasks by process */ int band; + + /* SchedTune ontime migration */ + int ontime_en; }; static inline struct schedtune *css_st(struct cgroup_subsys_state *css) @@ -402,6 +405,24 @@ int schedtune_util_est_en(struct task_struct *p) return util_est_en; } +int schedtune_ontime_en(struct task_struct *p) +{ + struct schedtune *st; + int ontime_en; + + if (unlikely(!schedtune_initialized)) + return 0; + + /* Get ontime value */ + rcu_read_lock(); + st = task_schedtune(p); + ontime_en = st->ontime_en; + rcu_read_unlock(); + + return ontime_en; + +} + int schedtune_prefer_idle(struct task_struct *p) { struct schedtune *st; @@ -478,6 +499,24 @@ util_est_en_write(struct cgroup_subsys_state *css, struct cftype *cft, return 0; } +static u64 +ontime_en_read(struct cgroup_subsys_state *css, struct cftype *cft) +{ + struct schedtune *st = css_st(css); + + return st->ontime_en; +} + +static int +ontime_en_write(struct cgroup_subsys_state *css, struct cftype *cft, + u64 ontime_en) +{ + struct schedtune *st = css_st(css); + st->ontime_en = ontime_en; + + return 0; +} + static u64 band_read(struct cgroup_subsys_state *css, struct cftype *cft) { @@ -583,6 +622,11 @@ static struct cftype files[] = { .read_u64 = util_est_en_read, .write_u64 = util_est_en_write, }, + { + .name = "ontime_en", + .read_u64 = ontime_en_read, + .write_u64 = ontime_en_write, + }, { } /* terminate */ }; diff --git a/kernel/sched/tune.h b/kernel/sched/tune.h index 5b3568649188..9d8acf5ec02a 100644 --- a/kernel/sched/tune.h +++ b/kernel/sched/tune.h @@ -18,6 +18,7 @@ int schedtune_task_boost(struct task_struct *tsk); int schedtune_prefer_idle(struct task_struct *tsk); int schedtune_prefer_perf(struct task_struct *tsk); int schedtune_util_est_en(struct task_struct *tsk); +int schedtune_ontime_en(struct task_struct *tsk); void schedtune_enqueue_task(struct task_struct *p, int cpu); void schedtune_dequeue_task(struct task_struct *p, int cpu); @@ -30,6 +31,7 @@ void schedtune_dequeue_task(struct task_struct *p, int cpu); #define schedtune_prefer_idle(tsk) 0 #define schedtune_prefer_perf(tsk) 0 #define schedtune_util_est_en(tsk) 0 +#define schedtune_ontime_en(tsk) 0 #define schedtune_enqueue_task(task, cpu) do { } while (0) #define schedtune_dequeue_task(task, cpu) do { } while (0) -- 2.20.1