sched: Store system-wide maximum cpu capacity in root domain
authorDietmar Eggemann <dietmar.eggemann@arm.com>
Thu, 7 May 2015 17:46:15 +0000 (18:46 +0100)
committerAmit Pundir <amit.pundir@linaro.org>
Wed, 14 Sep 2016 09:18:50 +0000 (14:48 +0530)
To be able to compare the capacity of the target cpu with the highest
cpu capacity of the system in the wakeup path, store the system-wide
maximum cpu capacity in the root domain.

cc: Ingo Molnar <mingo@redhat.com>
cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
kernel/sched/core.c
kernel/sched/sched.h

index 6f6c7cc13f33a26179a5c52cc1bf42eacd2695f9..8bf7556972305030cab69fbf80e82855d9e776ff 100644 (file)
@@ -6975,6 +6975,7 @@ static int build_sched_domains(const struct cpumask *cpu_map,
        enum s_alloc alloc_state;
        struct sched_domain *sd;
        struct s_data d;
+       struct rq *rq = NULL;
        int i, ret = -ENOMEM;
 
        alloc_state = __visit_domain_allocation_hell(&d, cpu_map);
@@ -7025,11 +7026,18 @@ static int build_sched_domains(const struct cpumask *cpu_map,
        /* Attach the domains */
        rcu_read_lock();
        for_each_cpu(i, cpu_map) {
+               rq = cpu_rq(i);
                sd = *per_cpu_ptr(d.sd, i);
                cpu_attach_domain(sd, d.rd, i);
+
+               if (rq->cpu_capacity_orig > rq->rd->max_cpu_capacity)
+                       rq->rd->max_cpu_capacity = rq->cpu_capacity_orig;
        }
        rcu_read_unlock();
 
+       if (rq)
+               pr_info("max cpu_capacity %lu\n", rq->rd->max_cpu_capacity);
+
        ret = 0;
 error:
        __free_domain_allocs(&d, alloc_state, cpu_map);
index 0517abd7dd73b95f152f339b684328165d76f59f..412a072da77531ad153d8d401055b0346e0e6b68 100644 (file)
@@ -543,6 +543,9 @@ struct root_domain {
         */
        cpumask_var_t rto_mask;
        struct cpupri cpupri;
+
+       /* Maximum cpu capacity in the system. */
+       unsigned long max_cpu_capacity;
 };
 
 extern struct root_domain def_root_domain;