From: Matthew Dobson In light of some proposed changes in the sched_domains code, I coded up this little ditty that simply creates and populates a cpu_sibling_map for PPC64 machines. The patch just checks the CPU flags to determine if the CPU supports SMT (aka Hyper-Threading aka Multi-Threading aka ...) and fills in a mask of the siblings for each CPU in the system. This should allow us to build sched_domains for PPC64 with generic code in kernel/sched.c for the SMT systems. SMT is becoming more popular and is turning up in more and more architectures. I don't think it will be too long until this feature is supported by most arches... Signed-off-by: Matthew Dobson DESC create-cpu_sibling_map-for-ppc64-fix EDESC Signed-off-by: Andrew Morton --- 25-akpm/arch/ppc64/kernel/smp.c | 7 +++++++ 25-akpm/include/asm-ppc64/smp.h | 2 ++ 2 files changed, 9 insertions(+) diff -puN arch/ppc64/kernel/smp.c~create-cpu_sibling_map-for-ppc64 arch/ppc64/kernel/smp.c --- 25/arch/ppc64/kernel/smp.c~create-cpu_sibling_map-for-ppc64 Mon Aug 16 16:03:34 2004 +++ 25-akpm/arch/ppc64/kernel/smp.c Mon Aug 16 16:03:38 2004 @@ -59,6 +59,7 @@ unsigned long cache_decay_ticks; cpumask_t cpu_possible_map = CPU_MASK_NONE; cpumask_t cpu_online_map = CPU_MASK_NONE; +cpumask_t cpu_sibling_map[NR_CPUS] = { [0 ... NR_CPUS-1] = CPU_MASK_NONE }; EXPORT_SYMBOL(cpu_online_map); EXPORT_SYMBOL(cpu_possible_map); @@ -858,6 +859,12 @@ void __init smp_prepare_cpus(unsigned in for_each_cpu(cpu) if (cpu != boot_cpuid) smp_create_idle(cpu); + + for_each_cpu(cpu) { + cpu_set(cpu, cpu_sibling_map[cpu]); + if (cur_cpu_spec->cpu_features & CPU_FTR_SMT) + cpu_set(cpu ^ 0x1, cpu_sibling_map[cpu]); + } } void __devinit smp_prepare_boot_cpu(void) diff -puN include/asm-ppc64/smp.h~create-cpu_sibling_map-for-ppc64 include/asm-ppc64/smp.h --- 25/include/asm-ppc64/smp.h~create-cpu_sibling_map-for-ppc64 Mon Aug 16 16:03:34 2004 +++ 25-akpm/include/asm-ppc64/smp.h Mon Aug 16 16:03:34 2004 @@ -36,6 +36,8 @@ extern void smp_message_recv(int, struct #define smp_processor_id() (get_paca()->paca_index) #define hard_smp_processor_id() (get_paca()->hw_cpu_id) +extern cpumask_t cpu_sibling_map[NR_CPUS]; + /* Since OpenPIC has only 4 IPIs, we use slightly different message numbers. * * Make sure this matches openpic_request_IPIs in open_pic.c, or what shows up _