diff options
| author | Srivatsa Vaddagiri <vatsa@codeaurora.org> | 2016-09-09 19:38:03 +0530 |
|---|---|---|
| committer | Pavankumar Kondeti <pkondeti@codeaurora.org> | 2016-12-16 16:50:52 +0530 |
| commit | 0dee0d1411e4ba837089a769a5bcce57a5a14df2 (patch) | |
| tree | f4d1423b387e4661efb73b32ba7489c48ecb494b /kernel/sched/rt.c | |
| parent | f8c7c6ffdfb366efce72a4df93d124659a246b8c (diff) | |
sched: Avoid waking idle cpu for short-burst tasks
Introduce sched_short_burst tunable to classify "short-burst" tasks.
These tasks are eligible for packing to avoid overhead associated with
waking up an idle CPU. select_best_cpu() ignores power-cost and selects
the CPU with least wakeup latency which is not loaded with IRQs and
can accommodate this task without exceeding spill limits. The ties are
broken with load followed by previous CPU.
This policy does not affect cluster selection but only CPU selection
in the selected cluster. The tasks eligible for "wakeup-up-idle" and
"boost" are not considered for packing. This policy is applied for
both "fair" and "rt" scheduling class tasks.
Change-Id: I2a05493fde93f58636725f18d0ce8dbce4418a30
Signed-off-by: Srivatsa Vaddagiri <vatsa@codeaurora.org>
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
Diffstat (limited to 'kernel/sched/rt.c')
| -rw-r--r-- | kernel/sched/rt.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index 52edd6b158ed..624bededfb85 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c @@ -1679,6 +1679,7 @@ static int find_lowest_rq_hmp(struct task_struct *task) int i; int restrict_cluster; int boost_on_big; + int pack_task, wakeup_latency, least_wakeup_latency = INT_MAX; boost_on_big = sched_boost() == FULL_THROTTLE_BOOST && sched_boost_policy() == SCHED_BOOST_ON_BIG; @@ -1695,6 +1696,8 @@ static int find_lowest_rq_hmp(struct task_struct *task) if (!cpupri_find(&task_rq(task)->rd->cpupri, task, lowest_mask)) return best_cpu; /* No targets found */ + pack_task = is_short_burst_task(task); + /* * At this point we have built a mask of cpus representing the * lowest priority tasks in the system. Now we want to elect @@ -1720,6 +1723,20 @@ static int find_lowest_rq_hmp(struct task_struct *task) if (!restrict_cluster) cpu_load = scale_load_to_cpu(cpu_load, i); + if (pack_task) { + wakeup_latency = cpu_rq(i)->wakeup_latency; + + if (wakeup_latency > least_wakeup_latency) + continue; + + if (wakeup_latency < least_wakeup_latency) { + least_wakeup_latency = wakeup_latency; + min_load = cpu_load; + best_cpu = i; + continue; + } + } + if (cpu_load < min_load || (cpu_load == min_load && (i == prev_cpu || (best_cpu != prev_cpu && @@ -1728,6 +1745,7 @@ static int find_lowest_rq_hmp(struct task_struct *task) best_cpu = i; } } + if (restrict_cluster && best_cpu != -1) break; } |
