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/ia64 | |
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/ia64')
-rw-r--r-- | arch/ia64/kernel/setup.c | 12 | ||||
-rw-r--r-- | arch/ia64/kernel/smpboot.c | 18 |
2 files changed, 18 insertions, 12 deletions
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index 9e392a30d197..777c8d8bd5e7 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
@@ -528,10 +528,6 @@ setup_arch (char **cmdline_p) | |||
528 | 528 | ||
529 | #ifdef CONFIG_SMP | 529 | #ifdef CONFIG_SMP |
530 | cpu_physical_id(0) = hard_smp_processor_id(); | 530 | cpu_physical_id(0) = hard_smp_processor_id(); |
531 | |||
532 | cpu_set(0, cpu_sibling_map[0]); | ||
533 | cpu_set(0, cpu_core_map[0]); | ||
534 | |||
535 | check_for_logical_procs(); | 531 | check_for_logical_procs(); |
536 | if (smp_num_cpucores > 1) | 532 | if (smp_num_cpucores > 1) |
537 | printk(KERN_INFO | 533 | printk(KERN_INFO |
@@ -873,6 +869,14 @@ cpu_init (void) | |||
873 | void *cpu_data; | 869 | void *cpu_data; |
874 | 870 | ||
875 | cpu_data = per_cpu_init(); | 871 | cpu_data = per_cpu_init(); |
872 | /* | ||
873 | * insert boot cpu into sibling and core mapes | ||
874 | * (must be done after per_cpu area is setup) | ||
875 | */ | ||
876 | if (smp_processor_id() == 0) { | ||
877 | cpu_set(0, per_cpu(cpu_sibling_map, 0)); | ||
878 | cpu_set(0, cpu_core_map[0]); | ||
879 | } | ||
876 | 880 | ||
877 | /* | 881 | /* |
878 | * We set ar.k3 so that assembly code in MCA handler can compute | 882 | * We set ar.k3 so that assembly code in MCA handler can compute |
diff --git a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c index 308772f7cddc..c57dbce25c12 100644 --- a/arch/ia64/kernel/smpboot.c +++ b/arch/ia64/kernel/smpboot.c | |||
@@ -138,7 +138,9 @@ cpumask_t cpu_possible_map = CPU_MASK_NONE; | |||
138 | EXPORT_SYMBOL(cpu_possible_map); | 138 | EXPORT_SYMBOL(cpu_possible_map); |
139 | 139 | ||
140 | cpumask_t cpu_core_map[NR_CPUS] __cacheline_aligned; | 140 | cpumask_t cpu_core_map[NR_CPUS] __cacheline_aligned; |
141 | cpumask_t cpu_sibling_map[NR_CPUS] __cacheline_aligned; | 141 | DEFINE_PER_CPU_SHARED_ALIGNED(cpumask_t, cpu_sibling_map); |
142 | EXPORT_PER_CPU_SYMBOL(cpu_sibling_map); | ||
143 | |||
142 | int smp_num_siblings = 1; | 144 | int smp_num_siblings = 1; |
143 | int smp_num_cpucores = 1; | 145 | int smp_num_cpucores = 1; |
144 | 146 | ||
@@ -650,12 +652,12 @@ clear_cpu_sibling_map(int cpu) | |||
650 | { | 652 | { |
651 | int i; | 653 | int i; |
652 | 654 | ||
653 | for_each_cpu_mask(i, cpu_sibling_map[cpu]) | 655 | for_each_cpu_mask(i, per_cpu(cpu_sibling_map, cpu)) |
654 | cpu_clear(cpu, cpu_sibling_map[i]); | 656 | cpu_clear(cpu, per_cpu(cpu_sibling_map, i)); |
655 | for_each_cpu_mask(i, cpu_core_map[cpu]) | 657 | for_each_cpu_mask(i, cpu_core_map[cpu]) |
656 | cpu_clear(cpu, cpu_core_map[i]); | 658 | cpu_clear(cpu, cpu_core_map[i]); |
657 | 659 | ||
658 | cpu_sibling_map[cpu] = cpu_core_map[cpu] = CPU_MASK_NONE; | 660 | per_cpu(cpu_sibling_map, cpu) = cpu_core_map[cpu] = CPU_MASK_NONE; |
659 | } | 661 | } |
660 | 662 | ||
661 | static void | 663 | static void |
@@ -666,7 +668,7 @@ remove_siblinginfo(int cpu) | |||
666 | if (cpu_data(cpu)->threads_per_core == 1 && | 668 | if (cpu_data(cpu)->threads_per_core == 1 && |
667 | cpu_data(cpu)->cores_per_socket == 1) { | 669 | cpu_data(cpu)->cores_per_socket == 1) { |
668 | cpu_clear(cpu, cpu_core_map[cpu]); | 670 | cpu_clear(cpu, cpu_core_map[cpu]); |
669 | cpu_clear(cpu, cpu_sibling_map[cpu]); | 671 | cpu_clear(cpu, per_cpu(cpu_sibling_map, cpu)); |
670 | return; | 672 | return; |
671 | } | 673 | } |
672 | 674 | ||
@@ -807,8 +809,8 @@ set_cpu_sibling_map(int cpu) | |||
807 | cpu_set(i, cpu_core_map[cpu]); | 809 | cpu_set(i, cpu_core_map[cpu]); |
808 | cpu_set(cpu, cpu_core_map[i]); | 810 | cpu_set(cpu, cpu_core_map[i]); |
809 | if (cpu_data(cpu)->core_id == cpu_data(i)->core_id) { | 811 | if (cpu_data(cpu)->core_id == cpu_data(i)->core_id) { |
810 | cpu_set(i, cpu_sibling_map[cpu]); | 812 | cpu_set(i, per_cpu(cpu_sibling_map, cpu)); |
811 | cpu_set(cpu, cpu_sibling_map[i]); | 813 | cpu_set(cpu, per_cpu(cpu_sibling_map, i)); |
812 | } | 814 | } |
813 | } | 815 | } |
814 | } | 816 | } |
@@ -839,7 +841,7 @@ __cpu_up (unsigned int cpu) | |||
839 | 841 | ||
840 | if (cpu_data(cpu)->threads_per_core == 1 && | 842 | if (cpu_data(cpu)->threads_per_core == 1 && |
841 | cpu_data(cpu)->cores_per_socket == 1) { | 843 | cpu_data(cpu)->cores_per_socket == 1) { |
842 | cpu_set(cpu, cpu_sibling_map[cpu]); | 844 | cpu_set(cpu, per_cpu(cpu_sibling_map, cpu)); |
843 | cpu_set(cpu, cpu_core_map[cpu]); | 845 | cpu_set(cpu, cpu_core_map[cpu]); |
844 | return 0; | 846 | return 0; |
845 | } | 847 | } |