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/powerpc | |
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/powerpc')
-rw-r--r-- | arch/powerpc/kernel/setup-common.c | 20 | ||||
-rw-r--r-- | arch/powerpc/kernel/setup_64.c | 3 | ||||
-rw-r--r-- | arch/powerpc/kernel/smp.c | 4 | ||||
-rw-r--r-- | arch/powerpc/platforms/cell/cbe_cpufreq.c | 2 |
4 files changed, 22 insertions, 7 deletions
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index 36c90ba2d312..2de00f870edc 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c | |||
@@ -413,16 +413,28 @@ void __init smp_setup_cpu_maps(void) | |||
413 | of_node_put(dn); | 413 | of_node_put(dn); |
414 | } | 414 | } |
415 | 415 | ||
416 | vdso_data->processorCount = num_present_cpus(); | ||
417 | #endif /* CONFIG_PPC64 */ | ||
418 | } | ||
419 | |||
420 | /* | ||
421 | * Being that cpu_sibling_map is now a per_cpu array, then it cannot | ||
422 | * be initialized until the per_cpu areas have been created. This | ||
423 | * function is now called from setup_per_cpu_areas(). | ||
424 | */ | ||
425 | void __init smp_setup_cpu_sibling_map(void) | ||
426 | { | ||
427 | #if defined(CONFIG_PPC64) | ||
428 | int cpu; | ||
429 | |||
416 | /* | 430 | /* |
417 | * Do the sibling map; assume only two threads per processor. | 431 | * Do the sibling map; assume only two threads per processor. |
418 | */ | 432 | */ |
419 | for_each_possible_cpu(cpu) { | 433 | for_each_possible_cpu(cpu) { |
420 | cpu_set(cpu, cpu_sibling_map[cpu]); | 434 | cpu_set(cpu, per_cpu(cpu_sibling_map, cpu)); |
421 | if (cpu_has_feature(CPU_FTR_SMT)) | 435 | if (cpu_has_feature(CPU_FTR_SMT)) |
422 | cpu_set(cpu ^ 0x1, cpu_sibling_map[cpu]); | 436 | cpu_set(cpu ^ 0x1, per_cpu(cpu_sibling_map, cpu)); |
423 | } | 437 | } |
424 | |||
425 | vdso_data->processorCount = num_present_cpus(); | ||
426 | #endif /* CONFIG_PPC64 */ | 438 | #endif /* CONFIG_PPC64 */ |
427 | } | 439 | } |
428 | #endif /* CONFIG_SMP */ | 440 | #endif /* CONFIG_SMP */ |
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 008ab6823b02..0e014550b83f 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -597,6 +597,9 @@ void __init setup_per_cpu_areas(void) | |||
597 | paca[i].data_offset = ptr - __per_cpu_start; | 597 | paca[i].data_offset = ptr - __per_cpu_start; |
598 | memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); | 598 | memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); |
599 | } | 599 | } |
600 | |||
601 | /* Now that per_cpu is setup, initialize cpu_sibling_map */ | ||
602 | smp_setup_cpu_sibling_map(); | ||
600 | } | 603 | } |
601 | #endif | 604 | #endif |
602 | 605 | ||
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index d30f08fa0297..338950aeb6f6 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
@@ -61,11 +61,11 @@ struct thread_info *secondary_ti; | |||
61 | 61 | ||
62 | cpumask_t cpu_possible_map = CPU_MASK_NONE; | 62 | cpumask_t cpu_possible_map = CPU_MASK_NONE; |
63 | cpumask_t cpu_online_map = CPU_MASK_NONE; | 63 | cpumask_t cpu_online_map = CPU_MASK_NONE; |
64 | cpumask_t cpu_sibling_map[NR_CPUS] = { [0 ... NR_CPUS-1] = CPU_MASK_NONE }; | 64 | DEFINE_PER_CPU(cpumask_t, cpu_sibling_map) = CPU_MASK_NONE; |
65 | 65 | ||
66 | EXPORT_SYMBOL(cpu_online_map); | 66 | EXPORT_SYMBOL(cpu_online_map); |
67 | EXPORT_SYMBOL(cpu_possible_map); | 67 | EXPORT_SYMBOL(cpu_possible_map); |
68 | EXPORT_SYMBOL(cpu_sibling_map); | 68 | EXPORT_PER_CPU_SYMBOL(cpu_sibling_map); |
69 | 69 | ||
70 | /* SMP operations for this machine */ | 70 | /* SMP operations for this machine */ |
71 | struct smp_ops_t *smp_ops; | 71 | struct smp_ops_t *smp_ops; |
diff --git a/arch/powerpc/platforms/cell/cbe_cpufreq.c b/arch/powerpc/platforms/cell/cbe_cpufreq.c index 5123e9d4164b..13d5a87f13b1 100644 --- a/arch/powerpc/platforms/cell/cbe_cpufreq.c +++ b/arch/powerpc/platforms/cell/cbe_cpufreq.c | |||
@@ -117,7 +117,7 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
117 | policy->cur = cbe_freqs[cur_pmode].frequency; | 117 | policy->cur = cbe_freqs[cur_pmode].frequency; |
118 | 118 | ||
119 | #ifdef CONFIG_SMP | 119 | #ifdef CONFIG_SMP |
120 | policy->cpus = cpu_sibling_map[policy->cpu]; | 120 | policy->cpus = per_cpu(cpu_sibling_map, policy->cpu); |
121 | #endif | 121 | #endif |
122 | 122 | ||
123 | cpufreq_frequency_table_get_attr(cbe_freqs, policy->cpu); | 123 | cpufreq_frequency_table_get_attr(cbe_freqs, policy->cpu); |