summaryrefslogtreecommitdiff
path: root/kernel/sched/rt.c
diff options
context:
space:
mode:
authorSrivatsa Vaddagiri <vatsa@codeaurora.org>2016-09-09 19:38:03 +0530
committerPavankumar Kondeti <pkondeti@codeaurora.org>2016-12-16 16:50:52 +0530
commit0dee0d1411e4ba837089a769a5bcce57a5a14df2 (patch)
treef4d1423b387e4661efb73b32ba7489c48ecb494b /kernel/sched/rt.c
parentf8c7c6ffdfb366efce72a4df93d124659a246b8c (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.c18
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;
}