sched/topology: Record number of cores in sched group
authorTim C Chen <tim.c.chen@linux.intel.com>
Fri, 7 Jul 2023 22:57:01 +0000 (15:57 -0700)
committerPeter Zijlstra <peterz@infradead.org>
Thu, 13 Jul 2023 13:21:51 +0000 (15:21 +0200)
When balancing sibling domains that have different number of cores,
tasks in respective sibling domain should be proportional to the
number of cores in each domain. In preparation of implementing such a
policy, record the number of cores in a scheduling group.

Signed-off-by: Tim Chen <tim.c.chen@linux.intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/04641eeb0e95c21224352f5743ecb93dfac44654.1688770494.git.tim.c.chen@linux.intel.com
kernel/sched/sched.h
kernel/sched/topology.c

index 1dcea9bfa0a8668554648a2dfdb002f4f21f2b12..9baeb1a2dfdd450eda93297bf457f53787835c88 100644 (file)
@@ -1884,6 +1884,7 @@ struct sched_group {
        atomic_t                ref;
 
        unsigned int            group_weight;
+       unsigned int            cores;
        struct sched_group_capacity *sgc;
        int                     asym_prefer_cpu;        /* CPU of highest priority in group */
        int                     flags;
index d3a3b2646ec4fd84282e7113adaebca022ded036..7cfcfe5d27b90803439b48f1b95784347342fbee 100644 (file)
@@ -1275,14 +1275,24 @@ build_sched_groups(struct sched_domain *sd, int cpu)
 static void init_sched_groups_capacity(int cpu, struct sched_domain *sd)
 {
        struct sched_group *sg = sd->groups;
+       struct cpumask *mask = sched_domains_tmpmask2;
 
        WARN_ON(!sg);
 
        do {
-               int cpu, max_cpu = -1;
+               int cpu, cores = 0, max_cpu = -1;
 
                sg->group_weight = cpumask_weight(sched_group_span(sg));
 
+               cpumask_copy(mask, sched_group_span(sg));
+               for_each_cpu(cpu, mask) {
+                       cores++;
+#ifdef CONFIG_SCHED_SMT
+                       cpumask_andnot(mask, mask, cpu_smt_mask(cpu));
+#endif
+               }
+               sg->cores = cores;
+
                if (!(sd->flags & SD_ASYM_PACKING))
                        goto next;