sched/topology: Verify SD_* flags setup when sched_debug is on
authorValentin Schneider <valentin.schneider@arm.com>
Mon, 17 Aug 2020 11:29:51 +0000 (12:29 +0100)
committerIngo Molnar <mingo@kernel.org>
Wed, 19 Aug 2020 08:49:48 +0000 (10:49 +0200)
Now that we have some description of what we expect the flags layout to
be, we can use that to assert at runtime that the actual layout is sane.

Signed-off-by: Valentin Schneider <valentin.schneider@arm.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: https://lore.kernel.org/r/20200817113003.20802-6-valentin.schneider@arm.com
kernel/sched/topology.c

index fe03969..cbdaf08 100644 (file)
@@ -29,6 +29,8 @@ static int sched_domain_debug_one(struct sched_domain *sd, int cpu, int level,
                                  struct cpumask *groupmask)
 {
        struct sched_group *group = sd->groups;
+       unsigned long flags = sd->flags;
+       unsigned int idx;
 
        cpumask_clear(groupmask);
 
@@ -43,6 +45,21 @@ static int sched_domain_debug_one(struct sched_domain *sd, int cpu, int level,
                printk(KERN_ERR "ERROR: domain->groups does not contain CPU%d\n", cpu);
        }
 
+       for_each_set_bit(idx, &flags, __SD_FLAG_CNT) {
+               unsigned int flag = BIT(idx);
+               unsigned int meta_flags = sd_flag_debug[idx].meta_flags;
+
+               if ((meta_flags & SDF_SHARED_CHILD) && sd->child &&
+                   !(sd->child->flags & flag))
+                       printk(KERN_ERR "ERROR: flag %s set here but not in child\n",
+                              sd_flag_debug[idx].name);
+
+               if ((meta_flags & SDF_SHARED_PARENT) && sd->parent &&
+                   !(sd->parent->flags & flag))
+                       printk(KERN_ERR "ERROR: flag %s set here but not in parent\n",
+                              sd_flag_debug[idx].name);
+       }
+
        printk(KERN_DEBUG "%*s groups:", level + 1, "");
        do {
                if (!group) {