From 391324a26ed2c155d851adb17ef5fbf159779a59 Mon Sep 17 00:00:00 2001 From: Daeyeong Lee Date: Mon, 14 May 2018 19:09:11 +0900 Subject: [PATCH] sched: ems: ontime: Don't allow to down-migrate heaviest task. Change-Id: I0daf9e82d69438155ce80c33a6a4709523462491 Signed-off-by: Daeyeong Lee --- kernel/sched/ems/ontime.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/kernel/sched/ems/ontime.c b/kernel/sched/ems/ontime.c index e10fc9e47b2d..5ec29d40b48d 100644 --- a/kernel/sched/ems/ontime.c +++ b/kernel/sched/ems/ontime.c @@ -535,9 +535,32 @@ int ontime_can_migration(struct task_struct *p, int dst_cpu) return true; } + /* + * When runqueue is busy, check whether this task is heaviest. + * If this task is not heaviest in runqueue, allow it to be migrated. + */ if (cpu_rq(src_cpu)->nr_running > 1) { - trace_ems_ontime_check_migrate(p, dst_cpu, true, "curr is busy"); - return true; + struct task_struct *curr = cpu_curr(src_cpu); + struct sched_entity *se = __pick_first_entity(p->se.cfs_rq); + int count; + + /* Firstly, compare with curr running task */ + if (ontime_load_avg(p) < ontime_load_avg(curr)) { + trace_ems_ontime_check_migrate(p, dst_cpu, true, "busy runqueue"); + return true; + } + + /* Secondly, compare with tasks in rq */ + for (count = 0; se && count < TASK_TRACK_COUNT; + se = __pick_next_entity(se), count++) { + if (entity_is_cfs_rq(se)) + continue; + + if (ontime_load_avg(p) < ontime_load_avg(task_of(se))) { + trace_ems_ontime_check_migrate(p, dst_cpu, true, "busy runqueue"); + return true; + } + } } trace_ems_ontime_check_migrate(p, dst_cpu, false, "heavy task"); -- 2.20.1