|
@@ -83,6 +83,40 @@ static int __init nonx32_setup(char *str)
|
|
|
}
|
|
|
__setup("noexec32=", nonx32_setup);
|
|
|
|
|
|
+/*
|
|
|
+ * Copy data used in early init routines from the initial arrays to the
|
|
|
+ * per cpu data areas. These arrays then become expendable and the *_ptrs
|
|
|
+ * are zeroed indicating that the static arrays are gone.
|
|
|
+ */
|
|
|
+void __init setup_percpu_maps(void)
|
|
|
+{
|
|
|
+ int cpu;
|
|
|
+
|
|
|
+ for_each_possible_cpu(cpu) {
|
|
|
+#ifdef CONFIG_SMP
|
|
|
+ if (per_cpu_offset(cpu)) {
|
|
|
+#endif
|
|
|
+ per_cpu(x86_cpu_to_apicid, cpu) =
|
|
|
+ x86_cpu_to_apicid_init[cpu];
|
|
|
+#ifdef CONFIG_NUMA
|
|
|
+ per_cpu(x86_cpu_to_node_map, cpu) =
|
|
|
+ x86_cpu_to_node_map_init[cpu];
|
|
|
+#endif
|
|
|
+#ifdef CONFIG_SMP
|
|
|
+ }
|
|
|
+ else
|
|
|
+ printk(KERN_NOTICE "per_cpu_offset zero for cpu %d\n",
|
|
|
+ cpu);
|
|
|
+#endif
|
|
|
+ }
|
|
|
+
|
|
|
+ /* indicate the early static arrays are gone */
|
|
|
+ x86_cpu_to_apicid_early_ptr = NULL;
|
|
|
+#ifdef CONFIG_NUMA
|
|
|
+ x86_cpu_to_node_map_early_ptr = NULL;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Great future plan:
|
|
|
* Declare PDA itself and support (irqstack,tss,pgd) as per cpu data.
|
|
@@ -104,18 +138,21 @@ void __init setup_per_cpu_areas(void)
|
|
|
for_each_cpu_mask (i, cpu_possible_map) {
|
|
|
char *ptr;
|
|
|
|
|
|
- if (!NODE_DATA(cpu_to_node(i))) {
|
|
|
+ if (!NODE_DATA(early_cpu_to_node(i))) {
|
|
|
printk("cpu with no node %d, num_online_nodes %d\n",
|
|
|
i, num_online_nodes());
|
|
|
ptr = alloc_bootmem_pages(size);
|
|
|
} else {
|
|
|
- ptr = alloc_bootmem_pages_node(NODE_DATA(cpu_to_node(i)), size);
|
|
|
+ ptr = alloc_bootmem_pages_node(NODE_DATA(early_cpu_to_node(i)), size);
|
|
|
}
|
|
|
if (!ptr)
|
|
|
panic("Cannot allocate cpu data for CPU %d\n", i);
|
|
|
cpu_pda(i)->data_offset = ptr - __per_cpu_start;
|
|
|
memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start);
|
|
|
}
|
|
|
+
|
|
|
+ /* setup percpu data maps early */
|
|
|
+ setup_percpu_maps();
|
|
|
}
|
|
|
|
|
|
void pda_init(int cpu)
|