summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorPatrick Bellasi <patrick.bellasi@arm.com>2016-07-28 16:39:27 +0100
committerAmit Pundir <amit.pundir@linaro.org>2016-09-14 14:59:32 +0530
commitd3dd88bcc7a0b4ece9e52a8983c0025fec9d2f8a (patch)
tree4a6da08e7d5d91ecc78202517de16e12c3b5a507 /kernel
parentb312c991e9055198e96571feaf73df26e647df56 (diff)
FIX: sched/tune: update usage of boosted task utilisation on CPU selection
A boosted task needs to be scheduled on a CPU which can grant a minimum capacity which is higher than its utilization. However, a task can be allocated on a CPU which already provides an utilization which is higher than the task boosted utilization itself. Moreover, with the previous approach a task 100% boosted is not fitting any CPU. This patch makes use of the boosted task utilization just as a threashold which defines the minimum capacity should be available on a CPU to host that task. Signed-off-by: Patrick Bellasi <patrick.bellasi@arm.com>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sched/fair.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index c60fd6685a05..08dad006801c 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -5657,6 +5657,7 @@ static int energy_aware_wake_cpu(struct task_struct *p, int target, int sync)
struct sched_group *sg, *sg_target;
int target_max_cap = INT_MAX;
int target_cpu = task_cpu(p);
+ unsigned long task_util_boosted, new_util;
int i;
if (sysctl_sched_sync_hint_enable && sync) {
@@ -5700,6 +5701,7 @@ static int energy_aware_wake_cpu(struct task_struct *p, int target, int sync)
}
} while (sg = sg->next, sg != sd->groups);
+ task_util_boosted = boosted_task_util(p);
/* Find cpu with sufficient capacity */
for_each_cpu_and(i, tsk_cpus_allowed(p), sched_group_cpus(sg_target)) {
/*
@@ -5707,8 +5709,13 @@ static int energy_aware_wake_cpu(struct task_struct *p, int target, int sync)
* so prev_cpu will receive a negative bias due to the double
* accounting. However, the blocked utilization may be zero.
*/
- int new_util = cpu_util(i) + boosted_task_util(p);
+ new_util = cpu_util(i) + task_util_boosted;
+ /*
+ * Ensure minimum capacity to grant the required boost.
+ * The target CPU can be already at a capacity level higher
+ * than the one required to boost the task.
+ */
if (new_util > capacity_orig_of(i))
continue;