aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2004-05-09 23:24:05 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-05-09 23:24:05 -0700
commitb45bb3397e0f2e7de0301d1ebc8ed53bfdea5ebf (patch)
tree1421304e22d267a0ea871aca4a75c526ccf15924 /kernel
parent8c136f71934b05aebb7ffb9631415b74f0906bad (diff)
downloadhistory-b45bb3397e0f2e7de0301d1ebc8ed53bfdea5ebf.tar.gz
[PATCH] sched_domain debugging
From: Nick Piggin <piggin@cyberone.com.au> Anton was attempting to make a sched domain topology for his POWER5 and was having some trouble. This patch only includes code which is ifdefed out, but hopefully it will be of some use to implementors.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sched.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index abbfb779e5eee8..b3db2b977d76d7 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -3395,9 +3395,87 @@ static void __init arch_init_sched_domains(void)
#endif /* CONFIG_NUMA */
#endif /* ARCH_HAS_SCHED_DOMAIN */
+#undef SCHED_DOMAIN_DEBUG
+#ifdef SCHED_DOMAIN_DEBUG
+void sched_domain_debug(void)
+{
+ int i;
+
+ for_each_cpu(i) {
+ int level = 0;
+ struct sched_domain *cpu_domain = cpu_sched_domain(i);
+
+ printk(KERN_DEBUG "CPU%d: %s\n",
+ i, (cpu_online(i) ? " online" : "offline"));
+
+ do {
+ int j;
+ char str[NR_CPUS];
+ struct sched_group *group = cpu_domain->groups;
+ cpumask_t groupmask, tmp;
+
+ cpumask_snprintf(str, NR_CPUS, cpu_domain->span);
+ cpus_clear(groupmask);
+
+ printk(KERN_DEBUG);
+ for (j = 0; j < level + 1; j++)
+ printk(" ");
+ printk("domain %d: span %s\n", level, str);
+
+ if (!cpu_isset(i, cpu_domain->span))
+ printk(KERN_DEBUG "ERROR domain->span does not contain CPU%d\n", i);
+ if (!cpu_isset(i, group->cpumask))
+ printk(KERN_DEBUG "ERROR domain->groups does not contain CPU%d\n", i);
+
+ printk(KERN_DEBUG);
+ for (j = 0; j < level + 2; j++)
+ printk(" ");
+ printk("groups:");
+ do {
+ if (group == NULL) {
+ printk(" ERROR: NULL");
+ break;
+ }
+
+ if (cpus_weight(group->cpumask) == 0)
+ printk(" ERROR empty group:");
+
+ cpus_and(tmp, groupmask, group->cpumask);
+ if (cpus_weight(tmp) > 0)
+ printk(" ERROR repeated CPUs:");
+
+ cpus_or(groupmask, groupmask, group->cpumask);
+
+ cpumask_snprintf(str, NR_CPUS, group->cpumask);
+ printk(" %s", str);
+
+ group = group->next;
+ } while (group != cpu_domain->groups);
+ printk("\n");
+
+ if (!cpus_equal(cpu_domain->span, groupmask))
+ printk(KERN_DEBUG "ERROR groups don't span domain->span\n");
+
+ level++;
+ cpu_domain = cpu_domain->parent;
+
+ if (cpu_domain) {
+ cpus_and(tmp, groupmask, cpu_domain->span);
+ if (!cpus_equal(tmp, groupmask))
+ printk(KERN_DEBUG "ERROR parent span is not a superset of domain->span\n");
+ }
+
+ } while (cpu_domain);
+ }
+}
+#else
+#define sched_domain_debug() {}
+#endif
+
void __init sched_init_smp(void)
{
arch_init_sched_domains();
+ sched_domain_debug();
}
#else
void __init sched_init_smp(void)