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.schnei...@arm.com>
---
 kernel/sched/topology.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
index 42b89668e1e4..cda02507aebf 100644
--- a/kernel/sched/topology.c
+++ b/kernel/sched/topology.c
@@ -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, BITS_PER_TYPE(typeof(flags))) {
+               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) {
-- 
2.27.0

Reply via email to