diff options
author | Mike Travis <travis@sgi.com> | 2007-10-16 04:24:05 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-16 12:42:50 -0400 |
commit | d5a7430ddcdb598261d70f7eb1bf450b5be52085 (patch) | |
tree | 3b94672e0dbc2bff125de3266908f1a47a17b795 /arch/x86/kernel/smpboot_32.c | |
parent | 083576112940fda783d716fd5ccc744f81667b2f (diff) |
Convert cpu_sibling_map to be a per cpu variable
Convert cpu_sibling_map from a static array sized by NR_CPUS to a per_cpu
variable. This saves sizeof(cpumask_t) * NR unused cpus. Access is mostly
from startup and CPU HOTPLUG functions.
Signed-off-by: Mike Travis <travis@sgi.com>
Cc: Andi Kleen <ak@suse.de>
Cc: Christoph Lameter <clameter@sgi.com>
Cc: "Siddha, Suresh B" <suresh.b.siddha@intel.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: "Luck, Tony" <tony.luck@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/x86/kernel/smpboot_32.c')
-rw-r--r-- | arch/x86/kernel/smpboot_32.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/arch/x86/kernel/smpboot_32.c b/arch/x86/kernel/smpboot_32.c index 4cbab48ba865..31fc08bd15ef 100644 --- a/arch/x86/kernel/smpboot_32.c +++ b/arch/x86/kernel/smpboot_32.c | |||
@@ -70,8 +70,8 @@ EXPORT_SYMBOL(smp_num_siblings); | |||
70 | int cpu_llc_id[NR_CPUS] __cpuinitdata = {[0 ... NR_CPUS-1] = BAD_APICID}; | 70 | int cpu_llc_id[NR_CPUS] __cpuinitdata = {[0 ... NR_CPUS-1] = BAD_APICID}; |
71 | 71 | ||
72 | /* representing HT siblings of each logical CPU */ | 72 | /* representing HT siblings of each logical CPU */ |
73 | cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly; | 73 | DEFINE_PER_CPU(cpumask_t, cpu_sibling_map); |
74 | EXPORT_SYMBOL(cpu_sibling_map); | 74 | EXPORT_PER_CPU_SYMBOL(cpu_sibling_map); |
75 | 75 | ||
76 | /* representing HT and core siblings of each logical CPU */ | 76 | /* representing HT and core siblings of each logical CPU */ |
77 | DEFINE_PER_CPU(cpumask_t, cpu_core_map); | 77 | DEFINE_PER_CPU(cpumask_t, cpu_core_map); |
@@ -319,8 +319,8 @@ void __cpuinit set_cpu_sibling_map(int cpu) | |||
319 | for_each_cpu_mask(i, cpu_sibling_setup_map) { | 319 | for_each_cpu_mask(i, cpu_sibling_setup_map) { |
320 | if (c[cpu].phys_proc_id == c[i].phys_proc_id && | 320 | if (c[cpu].phys_proc_id == c[i].phys_proc_id && |
321 | c[cpu].cpu_core_id == c[i].cpu_core_id) { | 321 | c[cpu].cpu_core_id == c[i].cpu_core_id) { |
322 | cpu_set(i, cpu_sibling_map[cpu]); | 322 | cpu_set(i, per_cpu(cpu_sibling_map, cpu)); |
323 | cpu_set(cpu, cpu_sibling_map[i]); | 323 | cpu_set(cpu, per_cpu(cpu_sibling_map, i)); |
324 | cpu_set(i, per_cpu(cpu_core_map, cpu)); | 324 | cpu_set(i, per_cpu(cpu_core_map, cpu)); |
325 | cpu_set(cpu, per_cpu(cpu_core_map, i)); | 325 | cpu_set(cpu, per_cpu(cpu_core_map, i)); |
326 | cpu_set(i, c[cpu].llc_shared_map); | 326 | cpu_set(i, c[cpu].llc_shared_map); |
@@ -328,13 +328,13 @@ void __cpuinit set_cpu_sibling_map(int cpu) | |||
328 | } | 328 | } |
329 | } | 329 | } |
330 | } else { | 330 | } else { |
331 | cpu_set(cpu, cpu_sibling_map[cpu]); | 331 | cpu_set(cpu, per_cpu(cpu_sibling_map, cpu)); |
332 | } | 332 | } |
333 | 333 | ||
334 | cpu_set(cpu, c[cpu].llc_shared_map); | 334 | cpu_set(cpu, c[cpu].llc_shared_map); |
335 | 335 | ||
336 | if (current_cpu_data.x86_max_cores == 1) { | 336 | if (current_cpu_data.x86_max_cores == 1) { |
337 | per_cpu(cpu_core_map, cpu) = cpu_sibling_map[cpu]; | 337 | per_cpu(cpu_core_map, cpu) = per_cpu(cpu_sibling_map, cpu); |
338 | c[cpu].booted_cores = 1; | 338 | c[cpu].booted_cores = 1; |
339 | return; | 339 | return; |
340 | } | 340 | } |
@@ -351,12 +351,12 @@ void __cpuinit set_cpu_sibling_map(int cpu) | |||
351 | /* | 351 | /* |
352 | * Does this new cpu bringup a new core? | 352 | * Does this new cpu bringup a new core? |
353 | */ | 353 | */ |
354 | if (cpus_weight(cpu_sibling_map[cpu]) == 1) { | 354 | if (cpus_weight(per_cpu(cpu_sibling_map, cpu)) == 1) { |
355 | /* | 355 | /* |
356 | * for each core in package, increment | 356 | * for each core in package, increment |
357 | * the booted_cores for this new cpu | 357 | * the booted_cores for this new cpu |
358 | */ | 358 | */ |
359 | if (first_cpu(cpu_sibling_map[i]) == i) | 359 | if (first_cpu(per_cpu(cpu_sibling_map, i)) == i) |
360 | c[cpu].booted_cores++; | 360 | c[cpu].booted_cores++; |
361 | /* | 361 | /* |
362 | * increment the core count for all | 362 | * increment the core count for all |
@@ -983,7 +983,7 @@ static void __init smp_boot_cpus(unsigned int max_cpus) | |||
983 | printk(KERN_NOTICE "Local APIC not detected." | 983 | printk(KERN_NOTICE "Local APIC not detected." |
984 | " Using dummy APIC emulation.\n"); | 984 | " Using dummy APIC emulation.\n"); |
985 | map_cpu_to_logical_apicid(); | 985 | map_cpu_to_logical_apicid(); |
986 | cpu_set(0, cpu_sibling_map[0]); | 986 | cpu_set(0, per_cpu(cpu_sibling_map, 0)); |
987 | cpu_set(0, per_cpu(cpu_core_map, 0)); | 987 | cpu_set(0, per_cpu(cpu_core_map, 0)); |
988 | return; | 988 | return; |
989 | } | 989 | } |
@@ -1008,7 +1008,7 @@ static void __init smp_boot_cpus(unsigned int max_cpus) | |||
1008 | printk(KERN_ERR "... forcing use of dummy APIC emulation. (tell your hw vendor)\n"); | 1008 | printk(KERN_ERR "... forcing use of dummy APIC emulation. (tell your hw vendor)\n"); |
1009 | smpboot_clear_io_apic_irqs(); | 1009 | smpboot_clear_io_apic_irqs(); |
1010 | phys_cpu_present_map = physid_mask_of_physid(0); | 1010 | phys_cpu_present_map = physid_mask_of_physid(0); |
1011 | cpu_set(0, cpu_sibling_map[0]); | 1011 | cpu_set(0, per_cpu(cpu_sibling_map, 0)); |
1012 | cpu_set(0, per_cpu(cpu_core_map, 0)); | 1012 | cpu_set(0, per_cpu(cpu_core_map, 0)); |
1013 | return; | 1013 | return; |
1014 | } | 1014 | } |
@@ -1023,7 +1023,7 @@ static void __init smp_boot_cpus(unsigned int max_cpus) | |||
1023 | printk(KERN_INFO "SMP mode deactivated, forcing use of dummy APIC emulation.\n"); | 1023 | printk(KERN_INFO "SMP mode deactivated, forcing use of dummy APIC emulation.\n"); |
1024 | smpboot_clear_io_apic_irqs(); | 1024 | smpboot_clear_io_apic_irqs(); |
1025 | phys_cpu_present_map = physid_mask_of_physid(0); | 1025 | phys_cpu_present_map = physid_mask_of_physid(0); |
1026 | cpu_set(0, cpu_sibling_map[0]); | 1026 | cpu_set(0, per_cpu(cpu_sibling_map, 0)); |
1027 | cpu_set(0, per_cpu(cpu_core_map, 0)); | 1027 | cpu_set(0, per_cpu(cpu_core_map, 0)); |
1028 | return; | 1028 | return; |
1029 | } | 1029 | } |
@@ -1102,15 +1102,15 @@ static void __init smp_boot_cpus(unsigned int max_cpus) | |||
1102 | Dprintk("Boot done.\n"); | 1102 | Dprintk("Boot done.\n"); |
1103 | 1103 | ||
1104 | /* | 1104 | /* |
1105 | * construct cpu_sibling_map[], so that we can tell sibling CPUs | 1105 | * construct cpu_sibling_map, so that we can tell sibling CPUs |
1106 | * efficiently. | 1106 | * efficiently. |
1107 | */ | 1107 | */ |
1108 | for (cpu = 0; cpu < NR_CPUS; cpu++) { | 1108 | for (cpu = 0; cpu < NR_CPUS; cpu++) { |
1109 | cpus_clear(cpu_sibling_map[cpu]); | 1109 | cpus_clear(per_cpu(cpu_sibling_map, cpu)); |
1110 | cpus_clear(per_cpu(cpu_core_map, cpu)); | 1110 | cpus_clear(per_cpu(cpu_core_map, cpu)); |
1111 | } | 1111 | } |
1112 | 1112 | ||
1113 | cpu_set(0, cpu_sibling_map[0]); | 1113 | cpu_set(0, per_cpu(cpu_sibling_map, 0)); |
1114 | cpu_set(0, per_cpu(cpu_core_map, 0)); | 1114 | cpu_set(0, per_cpu(cpu_core_map, 0)); |
1115 | 1115 | ||
1116 | smpboot_setup_io_apic(); | 1116 | smpboot_setup_io_apic(); |
@@ -1153,13 +1153,13 @@ void remove_siblinginfo(int cpu) | |||
1153 | /*/ | 1153 | /*/ |
1154 | * last thread sibling in this cpu core going down | 1154 | * last thread sibling in this cpu core going down |
1155 | */ | 1155 | */ |
1156 | if (cpus_weight(cpu_sibling_map[cpu]) == 1) | 1156 | if (cpus_weight(per_cpu(cpu_sibling_map, cpu)) == 1) |
1157 | c[sibling].booted_cores--; | 1157 | c[sibling].booted_cores--; |
1158 | } | 1158 | } |
1159 | 1159 | ||
1160 | for_each_cpu_mask(sibling, cpu_sibling_map[cpu]) | 1160 | for_each_cpu_mask(sibling, per_cpu(cpu_sibling_map, cpu)) |
1161 | cpu_clear(cpu, cpu_sibling_map[sibling]); | 1161 | cpu_clear(cpu, per_cpu(cpu_sibling_map, sibling)); |
1162 | cpus_clear(cpu_sibling_map[cpu]); | 1162 | cpus_clear(per_cpu(cpu_sibling_map, cpu)); |
1163 | cpus_clear(per_cpu(cpu_core_map, cpu)); | 1163 | cpus_clear(per_cpu(cpu_core_map, cpu)); |
1164 | c[cpu].phys_proc_id = 0; | 1164 | c[cpu].phys_proc_id = 0; |
1165 | c[cpu].cpu_core_id = 0; | 1165 | c[cpu].cpu_core_id = 0; |