Commit b5c58730 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] x86-64: convert sibling map to masks

From: Andi Kleen <ak@muc.de>

From: Suresh B. Siddha

Convert sibling map on x86-64 to cpumasks.

This is needed for the SMT patches.
parent d03480a1
...@@ -73,7 +73,7 @@ struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned; ...@@ -73,7 +73,7 @@ struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
/* Set when the idlers are all forked */ /* Set when the idlers are all forked */
int smp_threads_ready; int smp_threads_ready;
char cpu_sibling_map[NR_CPUS] __cacheline_aligned; cpumask_t cpu_sibling_map[NR_CPUS] __cacheline_aligned;
/* /*
* Trampoline 80x86 program as an array. * Trampoline 80x86 program as an array.
...@@ -874,31 +874,36 @@ static void __init smp_boot_cpus(unsigned int max_cpus) ...@@ -874,31 +874,36 @@ static void __init smp_boot_cpus(unsigned int max_cpus)
} }
/* /*
* If Hyper-Threading is avaialble, construct cpu_sibling_map[], so * Construct cpu_sibling_map[], so that we can tell the
* that we can tell the sibling CPU efficiently. * sibling CPU efficiently.
*/ */
if (cpu_has_ht && smp_num_siblings > 1) {
for (cpu = 0; cpu < NR_CPUS; cpu++) for (cpu = 0; cpu < NR_CPUS; cpu++)
cpu_sibling_map[cpu] = NO_PROC_ID; cpus_clear(cpu_sibling_map[cpu]);
for (cpu = 0; cpu < NR_CPUS; cpu++) { for (cpu = 0; cpu < NR_CPUS; cpu++) {
int siblings = 0;
int i; int i;
if (!cpu_isset(cpu, cpu_callout_map)) if (!cpu_isset(cpu, cpu_callout_map))
continue; continue;
if (smp_num_siblings > 1) {
for (i = 0; i < NR_CPUS; i++) { for (i = 0; i < NR_CPUS; i++) {
if (i == cpu || !cpu_isset(i, cpu_callout_map)) if (!cpu_isset(i, cpu_callout_map))
continue; continue;
if (phys_proc_id[cpu] == phys_proc_id[i]) { if (phys_proc_id[cpu] == phys_proc_id[i]) {
cpu_sibling_map[cpu] = i; siblings++;
break; cpu_set(i, cpu_sibling_map[cpu]);
}
} }
if (cpu_sibling_map[cpu] == (char)NO_PROC_ID) {
smp_num_siblings = 1;
printk(KERN_WARNING "WARNING: No sibling found for CPU %d.\n", cpu);
} }
} else {
siblings++;
cpu_set(cpu, cpu_sibling_map[cpu]);
} }
if (siblings != smp_num_siblings)
printk(KERN_WARNING
"WARNING: %d siblings found for CPU%d, should be %d\n",
siblings, cpu, smp_num_siblings);
} }
Dprintk("Boot done.\n"); Dprintk("Boot done.\n");
......
...@@ -47,7 +47,7 @@ extern void smp_invalidate_rcv(void); /* Process an NMI */ ...@@ -47,7 +47,7 @@ extern void smp_invalidate_rcv(void); /* Process an NMI */
extern void (*mtrr_hook) (void); extern void (*mtrr_hook) (void);
extern void zap_low_mappings(void); extern void zap_low_mappings(void);
void smp_stop_cpu(void); void smp_stop_cpu(void);
extern char cpu_sibling_map[]; extern cpumask_t cpu_sibling_map[NR_CPUS];
extern char phys_proc_id[NR_CPUS]; extern char phys_proc_id[NR_CPUS];
#define SMP_TRAMPOLINE_BASE 0x6000 #define SMP_TRAMPOLINE_BASE 0x6000
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment