From: Matthew Dobson <colpatch@us.ibm.com>

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 <colpatch@us.ibm.com>
DESC
create-cpu_sibling_map-for-ppc64-fix
EDESC
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 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
_