x86-32, NUMA: Update numaq to use new NUMA init protocol
authorTejun Heo <tj@kernel.org>
Mon, 2 May 2011 12:18:53 +0000 (14:18 +0200)
committerTejun Heo <tj@kernel.org>
Mon, 2 May 2011 12:18:53 +0000 (14:18 +0200)
Update numaq such that it calls numa_add_memblk() and sets
numa_nodes_parsed instead of directly diddling with NUMA states.  The
original get_memcfg_numaq() is renamed to numaq_numa_init() and new
get_memcfg_numaq() is created in numa_32.c.

The shim numa_add_memblk() implementation handles node_start/end_pfn[]
and node_set_online() for nodes with memory.  The new
get_memcfg_numaq() exactly the same with get_memcfg_from_srat() other
than calling the numaq init function.  Things get_memcfgs_numaq() do
are not strictly necessary for numaq but added for consistency and to
help unifying NUMA init handling.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
arch/x86/include/asm/numaq.h
arch/x86/kernel/apic/numaq_32.c
arch/x86/mm/numa_32.c

index 37c516545ec8c7a8b73b13e84c37756d1a6ac6e2..c3b3c322fd8773eb785de0839d5a240aeb92b942 100644 (file)
@@ -29,7 +29,7 @@
 #ifdef CONFIG_X86_NUMAQ
 
 extern int found_numaq;
-extern int get_memcfg_numaq(void);
+extern int numaq_numa_init(void);
 extern int pci_numaq_init(void);
 
 extern void *xquad_portio;
@@ -166,11 +166,6 @@ struct sys_cfg_data {
 
 void numaq_tsc_disable(void);
 
-#else
-static inline int get_memcfg_numaq(void)
-{
-       return 0;
-}
 #endif /* CONFIG_X86_NUMAQ */
 #endif /* _ASM_X86_NUMAQ_H */
 
index 41b8b29d36f541fa5baa0186dc9b1cbf8b8f6e38..30f13319e24b82f81a85d9de989a24024083af8c 100644 (file)
@@ -48,8 +48,6 @@
 #include <asm/e820.h>
 #include <asm/ipi.h>
 
-#define        MB_TO_PAGES(addr)               ((addr) << (20 - PAGE_SHIFT))
-
 int found_numaq;
 
 /*
@@ -79,25 +77,20 @@ int                                 quad_local_to_mp_bus_id[NR_CPUS/4][4];
 static inline void numaq_register_node(int node, struct sys_cfg_data *scd)
 {
        struct eachquadmem *eq = scd->eq + node;
+       u64 start = (u64)(eq->hi_shrd_mem_start - eq->priv_mem_size) << 20;
+       u64 end = (u64)(eq->hi_shrd_mem_start + eq->hi_shrd_mem_size) << 20;
+       int ret;
 
-       node_set_online(node);
-
-       /* Convert to pages */
-       node_start_pfn[node] =
-                MB_TO_PAGES(eq->hi_shrd_mem_start - eq->priv_mem_size);
-
-       node_end_pfn[node] =
-                MB_TO_PAGES(eq->hi_shrd_mem_start + eq->hi_shrd_mem_size);
-
-       memblock_x86_register_active_regions(node, node_start_pfn[node],
-                                               node_end_pfn[node]);
+       node_set(node, numa_nodes_parsed);
+       ret = numa_add_memblk(node, start, end);
+       BUG_ON(ret < 0);
 }
 
 /*
  * Function: smp_dump_qct()
  *
  * Description: gets memory layout from the quad config table.  This
- * function also updates node_online_map with the nodes (quads) present.
+ * function also updates numa_nodes_parsed with the nodes (quads) present.
  */
 static void __init smp_dump_qct(void)
 {
@@ -106,7 +99,6 @@ static void __init smp_dump_qct(void)
 
        scd = (void *)__va(SYS_CFG_DATA_PRIV_ADDR);
 
-       nodes_clear(node_online_map);
        for_each_node(node) {
                if (scd->quads_present31_0 & (1 << node))
                        numaq_register_node(node, scd);
@@ -276,14 +268,14 @@ static __init void early_check_numaq(void)
        }
 }
 
-int __init get_memcfg_numaq(void)
+int __init numaq_numa_init(void)
 {
        early_check_numaq();
        if (!found_numaq)
-               return 0;
+               return -ENOENT;
        smp_dump_qct();
 
-       return 1;
+       return 0;
 }
 
 #define NUMAQ_APIC_DFR_VALUE   (APIC_DFR_CLUSTER)
index 8641239a0667c59afbb5e999d479c29508f28c37..14135e52cef58f9f21236365a1f0027e9b56974d 100644 (file)
@@ -332,6 +332,29 @@ static __init void init_alloc_remap(int nid)
               nid, node_pa, node_pa + size, remap_va, remap_va + size);
 }
 
+static int get_memcfg_numaq(void)
+{
+#ifdef CONFIG_X86_NUMAQ
+       int nid;
+
+       if (numa_off)
+               return 0;
+
+       if (numaq_numa_init() < 0) {
+               nodes_clear(numa_nodes_parsed);
+               remove_all_active_ranges();
+               return 0;
+       }
+
+       for_each_node_mask(nid, numa_nodes_parsed)
+               node_set_online(nid);
+       sort_node_map();
+       return 1;
+#else
+       return 0;
+#endif
+}
+
 static int get_memcfg_from_srat(void)
 {
 #ifdef CONFIG_ACPI_NUMA