EAS: sched/fair: Re-integrate 'honor sync wakeups' into wakeup path
authorDietmar Eggemann <dietmar.eggemann@arm.com>
Mon, 5 Dec 2016 14:15:54 +0000 (14:15 +0000)
committerAmit Pundir <amit.pundir@linaro.org>
Wed, 21 Jun 2017 11:07:28 +0000 (16:37 +0530)
This patch re-integrates the part which was initially provided by
3b9d7554aeec ("EAS: sched/fair: tunable to honor sync wakeups") into
energy_aware_wake_cpu() into select_energy_cpu_brute().

Change-Id: I748fde3ecdeb44651179bce0a5bb8dd82d1903f6
Signed-off-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
(cherry picked from commit b75b7286cb068d5761621ea134c23dd131db953f)
Signed-off-by: Chris Redpath <chris.redpath@arm.com>
kernel/sched/fair.c

index ae3cc8df331c5a681a8ffc5b482ba9f4bc54cf85..5e4bf1e7627523c8b3d8766dc066bd3f0ee707a4 100644 (file)
@@ -5889,13 +5889,21 @@ static int wake_cap(struct task_struct *p, int cpu, int prev_cpu)
        return min_cap * 1024 < task_util(p) * capacity_margin;
 }
 
-static int select_energy_cpu_brute(struct task_struct *p, int prev_cpu)
+static int select_energy_cpu_brute(struct task_struct *p, int prev_cpu, int sync)
 {
        int i;
        int min_diff = 0, energy_cpu = prev_cpu, spare_cpu = prev_cpu;
        unsigned long max_spare = 0;
        struct sched_domain *sd;
 
+       if (sysctl_sched_sync_hint_enable && sync) {
+               int cpu = smp_processor_id();
+               cpumask_t search_cpus;
+               cpumask_and(&search_cpus, tsk_cpus_allowed(p), cpu_online_mask);
+               if (cpumask_test_cpu(cpu, &search_cpus))
+                       return cpu;
+       }
+
        rcu_read_lock();
 
        sd = rcu_dereference(per_cpu(sd_ea, prev_cpu));
@@ -5970,7 +5978,7 @@ select_task_rq_fair(struct task_struct *p, int prev_cpu, int sd_flag, int wake_f
                              && cpumask_test_cpu(cpu, tsk_cpus_allowed(p));
 
        if (energy_aware() && !(cpu_rq(prev_cpu)->rd->overutilized))
-               return select_energy_cpu_brute(p, prev_cpu);
+               return select_energy_cpu_brute(p, prev_cpu, sync);
 
        rcu_read_lock();
        for_each_domain(cpu, tmp) {