FIX: sched/tune: update usage of boosted task utilisation on CPU selection
authorPatrick Bellasi <patrick.bellasi@arm.com>
Thu, 28 Jul 2016 15:39:27 +0000 (16:39 +0100)
committerAmit Pundir <amit.pundir@linaro.org>
Wed, 14 Sep 2016 09:29:32 +0000 (14:59 +0530)
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>
kernel/sched/fair.c

index c60fd6685a054dd0a9383f93641746a59e2fa8b5..08dad006801c3f1712b690cb5264f9f841789e3c 100644 (file)
@@ -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;