diff options
author | travis@sgi.com <travis@sgi.com> | 2008-01-30 07:33:21 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:33:21 -0500 |
commit | 834beda15ecc43c110c0a6ac39ec1aa79f891716 (patch) | |
tree | 56f00ac3e1b06083c5be928dc740369a022b76fa /arch/x86/kernel/setup64.c | |
parent | ac72e7888a612dccfbc15b34698aad441bdfda10 (diff) |
x86: change NR_CPUS arrays in numa_64 fixup
Change the following static arrays sized by NR_CPUS to
per_cpu data variables:
char cpu_to_node_map[NR_CPUS];
fixup:
- Split cpu_to_node function into "early" and "late" versions
so that x86_cpu_to_node_map_early_ptr is not EXPORT'ed and
the cpu_to_node inline function is more streamlined.
- This also involves setting up the percpu maps as early as possible.
- Fix X86_32 NUMA build errors that previous version of this
patch caused.
V2->V3:
- add early_cpu_to_node function to keep cpu_to_node efficient
- move and rename smp_set_apicids() to setup_percpu_maps()
- call setup_percpu_maps() as early as possible
V1->V2:
- Removed extraneous casts
- Fix !NUMA builds with '#ifdef CONFIG_NUMA"
Signed-off-by: Mike Travis <travis@sgi.com>
Reviewed-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/kernel/setup64.c')
-rw-r--r-- | arch/x86/kernel/setup64.c | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/arch/x86/kernel/setup64.c b/arch/x86/kernel/setup64.c index 8fa0de810d0b..855ec82e4f76 100644 --- a/arch/x86/kernel/setup64.c +++ b/arch/x86/kernel/setup64.c | |||
@@ -84,6 +84,40 @@ static int __init nonx32_setup(char *str) | |||
84 | __setup("noexec32=", nonx32_setup); | 84 | __setup("noexec32=", nonx32_setup); |
85 | 85 | ||
86 | /* | 86 | /* |
87 | * Copy data used in early init routines from the initial arrays to the | ||
88 | * per cpu data areas. These arrays then become expendable and the *_ptrs | ||
89 | * are zeroed indicating that the static arrays are gone. | ||
90 | */ | ||
91 | void __init setup_percpu_maps(void) | ||
92 | { | ||
93 | int cpu; | ||
94 | |||
95 | for_each_possible_cpu(cpu) { | ||
96 | #ifdef CONFIG_SMP | ||
97 | if (per_cpu_offset(cpu)) { | ||
98 | #endif | ||
99 | per_cpu(x86_cpu_to_apicid, cpu) = | ||
100 | x86_cpu_to_apicid_init[cpu]; | ||
101 | #ifdef CONFIG_NUMA | ||
102 | per_cpu(x86_cpu_to_node_map, cpu) = | ||
103 | x86_cpu_to_node_map_init[cpu]; | ||
104 | #endif | ||
105 | #ifdef CONFIG_SMP | ||
106 | } | ||
107 | else | ||
108 | printk(KERN_NOTICE "per_cpu_offset zero for cpu %d\n", | ||
109 | cpu); | ||
110 | #endif | ||
111 | } | ||
112 | |||
113 | /* indicate the early static arrays are gone */ | ||
114 | x86_cpu_to_apicid_early_ptr = NULL; | ||
115 | #ifdef CONFIG_NUMA | ||
116 | x86_cpu_to_node_map_early_ptr = NULL; | ||
117 | #endif | ||
118 | } | ||
119 | |||
120 | /* | ||
87 | * Great future plan: | 121 | * Great future plan: |
88 | * Declare PDA itself and support (irqstack,tss,pgd) as per cpu data. | 122 | * Declare PDA itself and support (irqstack,tss,pgd) as per cpu data. |
89 | * Always point %gs to its beginning | 123 | * Always point %gs to its beginning |
@@ -104,18 +138,21 @@ void __init setup_per_cpu_areas(void) | |||
104 | for_each_cpu_mask (i, cpu_possible_map) { | 138 | for_each_cpu_mask (i, cpu_possible_map) { |
105 | char *ptr; | 139 | char *ptr; |
106 | 140 | ||
107 | if (!NODE_DATA(cpu_to_node(i))) { | 141 | if (!NODE_DATA(early_cpu_to_node(i))) { |
108 | printk("cpu with no node %d, num_online_nodes %d\n", | 142 | printk("cpu with no node %d, num_online_nodes %d\n", |
109 | i, num_online_nodes()); | 143 | i, num_online_nodes()); |
110 | ptr = alloc_bootmem_pages(size); | 144 | ptr = alloc_bootmem_pages(size); |
111 | } else { | 145 | } else { |
112 | ptr = alloc_bootmem_pages_node(NODE_DATA(cpu_to_node(i)), size); | 146 | ptr = alloc_bootmem_pages_node(NODE_DATA(early_cpu_to_node(i)), size); |
113 | } | 147 | } |
114 | if (!ptr) | 148 | if (!ptr) |
115 | panic("Cannot allocate cpu data for CPU %d\n", i); | 149 | panic("Cannot allocate cpu data for CPU %d\n", i); |
116 | cpu_pda(i)->data_offset = ptr - __per_cpu_start; | 150 | cpu_pda(i)->data_offset = ptr - __per_cpu_start; |
117 | memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); | 151 | memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); |
118 | } | 152 | } |
153 | |||
154 | /* setup percpu data maps early */ | ||
155 | setup_percpu_maps(); | ||
119 | } | 156 | } |
120 | 157 | ||
121 | void pda_init(int cpu) | 158 | void pda_init(int cpu) |