]> Pileus Git - ~andy/linux/blob - arch/x86/kernel/setup_percpu.c
x86: merge 64 and 32 SMP percpu handling
[~andy/linux] / arch / x86 / kernel / setup_percpu.c
1 #include <linux/kernel.h>
2 #include <linux/module.h>
3 #include <linux/init.h>
4 #include <linux/bootmem.h>
5 #include <linux/percpu.h>
6 #include <linux/kexec.h>
7 #include <linux/crash_dump.h>
8 #include <linux/smp.h>
9 #include <linux/topology.h>
10 #include <asm/sections.h>
11 #include <asm/processor.h>
12 #include <asm/setup.h>
13 #include <asm/mpspec.h>
14 #include <asm/apicdef.h>
15 #include <asm/highmem.h>
16 #include <asm/proto.h>
17 #include <asm/cpumask.h>
18
19 #ifdef CONFIG_DEBUG_PER_CPU_MAPS
20 # define DBG(x...) printk(KERN_DEBUG x)
21 #else
22 # define DBG(x...)
23 #endif
24
25 #ifdef CONFIG_X86_LOCAL_APIC
26 unsigned int num_processors;
27 unsigned disabled_cpus __cpuinitdata;
28 /* Processor that is doing the boot up */
29 unsigned int boot_cpu_physical_apicid = -1U;
30 EXPORT_SYMBOL(boot_cpu_physical_apicid);
31 unsigned int max_physical_apicid;
32
33 /* Bitmask of physically existing CPUs */
34 physid_mask_t phys_cpu_present_map;
35 #endif
36
37 /*
38  * Map cpu index to physical APIC ID
39  */
40 DEFINE_EARLY_PER_CPU(u16, x86_cpu_to_apicid, BAD_APICID);
41 DEFINE_EARLY_PER_CPU(u16, x86_bios_cpu_apicid, BAD_APICID);
42 EXPORT_EARLY_PER_CPU_SYMBOL(x86_cpu_to_apicid);
43 EXPORT_EARLY_PER_CPU_SYMBOL(x86_bios_cpu_apicid);
44
45 #if defined(CONFIG_NUMA) && defined(CONFIG_X86_64)
46 #define X86_64_NUMA     1       /* (used later) */
47
48 /*
49  * Map cpu index to node index
50  */
51 DEFINE_EARLY_PER_CPU(int, x86_cpu_to_node_map, NUMA_NO_NODE);
52 EXPORT_EARLY_PER_CPU_SYMBOL(x86_cpu_to_node_map);
53
54 /*
55  * Which logical CPUs are on which nodes
56  */
57 cpumask_t *node_to_cpumask_map;
58 EXPORT_SYMBOL(node_to_cpumask_map);
59
60 /*
61  * Setup node_to_cpumask_map
62  */
63 static void __init setup_node_to_cpumask_map(void);
64
65 #else
66 static inline void setup_node_to_cpumask_map(void) { }
67 #endif
68
69 #ifdef CONFIG_X86_64
70 void __cpuinit load_pda_offset(int cpu)
71 {
72         /* Memory clobbers used to order pda/percpu accesses */
73         mb();
74         wrmsrl(MSR_GS_BASE, cpu_pda(cpu));
75         mb();
76 }
77
78 #endif /* CONFIG_SMP && CONFIG_X86_64 */
79
80 #ifdef CONFIG_X86_64
81
82 /* correctly size the local cpu masks */
83 static void setup_cpu_local_masks(void)
84 {
85         alloc_bootmem_cpumask_var(&cpu_initialized_mask);
86         alloc_bootmem_cpumask_var(&cpu_callin_mask);
87         alloc_bootmem_cpumask_var(&cpu_callout_mask);
88         alloc_bootmem_cpumask_var(&cpu_sibling_setup_mask);
89 }
90
91 #else /* CONFIG_X86_32 */
92
93 static inline void setup_cpu_local_masks(void)
94 {
95 }
96
97 #endif /* CONFIG_X86_32 */
98
99 #ifdef CONFIG_HAVE_SETUP_PER_CPU_AREA
100 /*
101  * Copy data used in early init routines from the initial arrays to the
102  * per cpu data areas.  These arrays then become expendable and the
103  * *_early_ptr's are zeroed indicating that the static arrays are gone.
104  */
105 static void __init setup_per_cpu_maps(void)
106 {
107         int cpu;
108
109         for_each_possible_cpu(cpu) {
110                 per_cpu(x86_cpu_to_apicid, cpu) =
111                                 early_per_cpu_map(x86_cpu_to_apicid, cpu);
112                 per_cpu(x86_bios_cpu_apicid, cpu) =
113                                 early_per_cpu_map(x86_bios_cpu_apicid, cpu);
114 #ifdef X86_64_NUMA
115                 per_cpu(x86_cpu_to_node_map, cpu) =
116                                 early_per_cpu_map(x86_cpu_to_node_map, cpu);
117 #endif
118         }
119
120         /* indicate the early static arrays will soon be gone */
121         early_per_cpu_ptr(x86_cpu_to_apicid) = NULL;
122         early_per_cpu_ptr(x86_bios_cpu_apicid) = NULL;
123 #ifdef X86_64_NUMA
124         early_per_cpu_ptr(x86_cpu_to_node_map) = NULL;
125 #endif
126 }
127
128 #ifdef CONFIG_X86_64
129 unsigned long __per_cpu_offset[NR_CPUS] __read_mostly = {
130         [0] = (unsigned long)__per_cpu_load,
131 };
132 #else
133 unsigned long __per_cpu_offset[NR_CPUS] __read_mostly;
134 #endif
135 EXPORT_SYMBOL(__per_cpu_offset);
136
137 /*
138  * Great future plan:
139  * Declare PDA itself and support (irqstack,tss,pgd) as per cpu data.
140  * Always point %gs to its beginning
141  */
142 void __init setup_per_cpu_areas(void)
143 {
144         ssize_t size, old_size;
145         char *ptr;
146         int cpu;
147         unsigned long align = 1;
148
149         /* Copy section for each CPU (we discard the original) */
150         old_size = PERCPU_ENOUGH_ROOM;
151         align = max_t(unsigned long, PAGE_SIZE, align);
152         size = roundup(old_size, align);
153
154         pr_info("NR_CPUS:%d nr_cpumask_bits:%d nr_cpu_ids:%d nr_node_ids:%d\n",
155                 NR_CPUS, nr_cpumask_bits, nr_cpu_ids, nr_node_ids);
156
157         pr_info("PERCPU: Allocating %zd bytes of per cpu data\n", size);
158
159         for_each_possible_cpu(cpu) {
160 #ifndef CONFIG_NEED_MULTIPLE_NODES
161                 ptr = __alloc_bootmem(size, align,
162                                  __pa(MAX_DMA_ADDRESS));
163 #else
164                 int node = early_cpu_to_node(cpu);
165                 if (!node_online(node) || !NODE_DATA(node)) {
166                         ptr = __alloc_bootmem(size, align,
167                                          __pa(MAX_DMA_ADDRESS));
168                         pr_info("cpu %d has no node %d or node-local memory\n",
169                                 cpu, node);
170                         pr_debug("per cpu data for cpu%d at %016lx\n",
171                                  cpu, __pa(ptr));
172                 } else {
173                         ptr = __alloc_bootmem_node(NODE_DATA(node), size, align,
174                                                         __pa(MAX_DMA_ADDRESS));
175                         pr_debug("per cpu data for cpu%d on node%d at %016lx\n",
176                                 cpu, node, __pa(ptr));
177                 }
178 #endif
179
180                 memcpy(ptr, __per_cpu_load, __per_cpu_end - __per_cpu_start);
181                 per_cpu_offset(cpu) = ptr - __per_cpu_start;
182 #ifdef CONFIG_X86_64
183                 cpu_pda(cpu) = (void *)ptr;
184
185                 /*
186                  * CPU0 modified pda in the init data area, reload pda
187                  * offset for CPU0 and clear the area for others.
188                  */
189                 if (cpu == 0)
190                         load_pda_offset(0);
191                 else
192                         memset(cpu_pda(cpu), 0, sizeof(*cpu_pda(cpu)));
193 #endif
194                 per_cpu(this_cpu_off, cpu) = per_cpu_offset(cpu);
195
196                 DBG("PERCPU: cpu %4d %p\n", cpu, ptr);
197         }
198
199         /* Setup percpu data maps */
200         setup_per_cpu_maps();
201
202         /* Setup node to cpumask map */
203         setup_node_to_cpumask_map();
204
205         /* Setup cpu initialized, callin, callout masks */
206         setup_cpu_local_masks();
207 }
208
209 #endif
210
211 #ifdef X86_64_NUMA
212
213 /*
214  * Allocate node_to_cpumask_map based on number of available nodes
215  * Requires node_possible_map to be valid.
216  *
217  * Note: node_to_cpumask() is not valid until after this is done.
218  * (Use CONFIG_DEBUG_PER_CPU_MAPS to check this.)
219  */
220 static void __init setup_node_to_cpumask_map(void)
221 {
222         unsigned int node, num = 0;
223         cpumask_t *map;
224
225         /* setup nr_node_ids if not done yet */
226         if (nr_node_ids == MAX_NUMNODES) {
227                 for_each_node_mask(node, node_possible_map)
228                         num = node;
229                 nr_node_ids = num + 1;
230         }
231
232         /* allocate the map */
233         map = alloc_bootmem_low(nr_node_ids * sizeof(cpumask_t));
234         DBG("node_to_cpumask_map at %p for %d nodes\n", map, nr_node_ids);
235
236         pr_debug("Node to cpumask map at %p for %d nodes\n",
237                  map, nr_node_ids);
238
239         /* node_to_cpumask() will now work */
240         node_to_cpumask_map = map;
241 }
242
243 void __cpuinit numa_set_node(int cpu, int node)
244 {
245         int *cpu_to_node_map = early_per_cpu_ptr(x86_cpu_to_node_map);
246
247         /* early setting, no percpu area yet */
248         if (cpu_to_node_map) {
249                 cpu_to_node_map[cpu] = node;
250                 return;
251         }
252
253 #ifdef CONFIG_DEBUG_PER_CPU_MAPS
254         if (cpu >= nr_cpu_ids || !per_cpu_offset(cpu)) {
255                 printk(KERN_ERR "numa_set_node: invalid cpu# (%d)\n", cpu);
256                 dump_stack();
257                 return;
258         }
259 #endif
260         per_cpu(x86_cpu_to_node_map, cpu) = node;
261
262         if (node != NUMA_NO_NODE)
263                 cpu_pda(cpu)->nodenumber = node;
264 }
265
266 void __cpuinit numa_clear_node(int cpu)
267 {
268         numa_set_node(cpu, NUMA_NO_NODE);
269 }
270
271 #ifndef CONFIG_DEBUG_PER_CPU_MAPS
272
273 void __cpuinit numa_add_cpu(int cpu)
274 {
275         cpu_set(cpu, node_to_cpumask_map[early_cpu_to_node(cpu)]);
276 }
277
278 void __cpuinit numa_remove_cpu(int cpu)
279 {
280         cpu_clear(cpu, node_to_cpumask_map[early_cpu_to_node(cpu)]);
281 }
282
283 #else /* CONFIG_DEBUG_PER_CPU_MAPS */
284
285 /*
286  * --------- debug versions of the numa functions ---------
287  */
288 static void __cpuinit numa_set_cpumask(int cpu, int enable)
289 {
290         int node = early_cpu_to_node(cpu);
291         cpumask_t *mask;
292         char buf[64];
293
294         if (node_to_cpumask_map == NULL) {
295                 printk(KERN_ERR "node_to_cpumask_map NULL\n");
296                 dump_stack();
297                 return;
298         }
299
300         mask = &node_to_cpumask_map[node];
301         if (enable)
302                 cpu_set(cpu, *mask);
303         else
304                 cpu_clear(cpu, *mask);
305
306         cpulist_scnprintf(buf, sizeof(buf), mask);
307         printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n",
308                 enable ? "numa_add_cpu" : "numa_remove_cpu", cpu, node, buf);
309 }
310
311 void __cpuinit numa_add_cpu(int cpu)
312 {
313         numa_set_cpumask(cpu, 1);
314 }
315
316 void __cpuinit numa_remove_cpu(int cpu)
317 {
318         numa_set_cpumask(cpu, 0);
319 }
320
321 int cpu_to_node(int cpu)
322 {
323         if (early_per_cpu_ptr(x86_cpu_to_node_map)) {
324                 printk(KERN_WARNING
325                         "cpu_to_node(%d): usage too early!\n", cpu);
326                 dump_stack();
327                 return early_per_cpu_ptr(x86_cpu_to_node_map)[cpu];
328         }
329         return per_cpu(x86_cpu_to_node_map, cpu);
330 }
331 EXPORT_SYMBOL(cpu_to_node);
332
333 /*
334  * Same function as cpu_to_node() but used if called before the
335  * per_cpu areas are setup.
336  */
337 int early_cpu_to_node(int cpu)
338 {
339         if (early_per_cpu_ptr(x86_cpu_to_node_map))
340                 return early_per_cpu_ptr(x86_cpu_to_node_map)[cpu];
341
342         if (!per_cpu_offset(cpu)) {
343                 printk(KERN_WARNING
344                         "early_cpu_to_node(%d): no per_cpu area!\n", cpu);
345                 dump_stack();
346                 return NUMA_NO_NODE;
347         }
348         return per_cpu(x86_cpu_to_node_map, cpu);
349 }
350
351
352 /* empty cpumask */
353 static const cpumask_t cpu_mask_none;
354
355 /*
356  * Returns a pointer to the bitmask of CPUs on Node 'node'.
357  */
358 const cpumask_t *cpumask_of_node(int node)
359 {
360         if (node_to_cpumask_map == NULL) {
361                 printk(KERN_WARNING
362                         "cpumask_of_node(%d): no node_to_cpumask_map!\n",
363                         node);
364                 dump_stack();
365                 return (const cpumask_t *)&cpu_online_map;
366         }
367         if (node >= nr_node_ids) {
368                 printk(KERN_WARNING
369                         "cpumask_of_node(%d): node > nr_node_ids(%d)\n",
370                         node, nr_node_ids);
371                 dump_stack();
372                 return &cpu_mask_none;
373         }
374         return &node_to_cpumask_map[node];
375 }
376 EXPORT_SYMBOL(cpumask_of_node);
377
378 /*
379  * Returns a bitmask of CPUs on Node 'node'.
380  *
381  * Side note: this function creates the returned cpumask on the stack
382  * so with a high NR_CPUS count, excessive stack space is used.  The
383  * node_to_cpumask_ptr function should be used whenever possible.
384  */
385 cpumask_t node_to_cpumask(int node)
386 {
387         if (node_to_cpumask_map == NULL) {
388                 printk(KERN_WARNING
389                         "node_to_cpumask(%d): no node_to_cpumask_map!\n", node);
390                 dump_stack();
391                 return cpu_online_map;
392         }
393         if (node >= nr_node_ids) {
394                 printk(KERN_WARNING
395                         "node_to_cpumask(%d): node > nr_node_ids(%d)\n",
396                         node, nr_node_ids);
397                 dump_stack();
398                 return cpu_mask_none;
399         }
400         return node_to_cpumask_map[node];
401 }
402 EXPORT_SYMBOL(node_to_cpumask);
403
404 /*
405  * --------- end of debug versions of the numa functions ---------
406  */
407
408 #endif /* CONFIG_DEBUG_PER_CPU_MAPS */
409
410 #endif /* X86_64_NUMA */
411