]> err.no Git - linux-2.6/blobdiff - include/asm-x86/topology.h
x86: fix spontaneous reboot with allyesconfig bzImage
[linux-2.6] / include / asm-x86 / topology.h
index 2da1464ecbef0941dfa3f37250fbaf272f151a53..8af05a93f09714dd16fd54b7e3119960e554f103 100644 (file)
 #include <asm/mpspec.h>
 
 /* Mappings between logical cpu number and node number */
-DECLARE_PER_CPU(u16, x86_cpu_to_node_map);
-extern u16 x86_cpu_to_node_map_init[];
+#ifdef CONFIG_X86_32
+extern int cpu_to_node_map[];
+
+#else
+DECLARE_PER_CPU(int, x86_cpu_to_node_map);
+extern int x86_cpu_to_node_map_init[];
 extern void *x86_cpu_to_node_map_early_ptr;
+/* Returns the number of the current Node. */
+#define numa_node_id()         (early_cpu_to_node(raw_smp_processor_id()))
+#endif
+
 extern cpumask_t node_to_cpumask_map[];
 
-#define NUMA_NO_NODE   ((u16)(~0))
+#define NUMA_NO_NODE   (-1)
 
 /* Returns the number of the node containing CPU 'cpu' */
+#ifdef CONFIG_X86_32
+#define early_cpu_to_node(cpu) cpu_to_node(cpu)
 static inline int cpu_to_node(int cpu)
 {
-       u16 *cpu_to_node_map = x86_cpu_to_node_map_early_ptr;
+       return cpu_to_node_map[cpu];
+}
+
+#else /* CONFIG_X86_64 */
+static inline int early_cpu_to_node(int cpu)
+{
+       int *cpu_to_node_map = x86_cpu_to_node_map_early_ptr;
 
        if (cpu_to_node_map)
                return cpu_to_node_map[cpu];
@@ -50,6 +66,23 @@ static inline int cpu_to_node(int cpu)
                return NUMA_NO_NODE;
 }
 
+static inline int cpu_to_node(int cpu)
+{
+#ifdef CONFIG_DEBUG_PER_CPU_MAPS
+       if (x86_cpu_to_node_map_early_ptr) {
+               printk("KERN_NOTICE cpu_to_node(%d): usage too early!\n",
+                       (int)cpu);
+               dump_stack();
+               return ((int *)x86_cpu_to_node_map_early_ptr)[cpu];
+       }
+#endif
+       if (per_cpu_offset(cpu))
+               return per_cpu(x86_cpu_to_node_map, cpu);
+       else
+               return NUMA_NO_NODE;
+}
+#endif /* CONFIG_X86_64 */
+
 /*
  * Returns the number of the node containing Node 'node'. This
  * architecture is flat, so it is a pretty simple function!