]> err.no Git - linux-2.6/commitdiff
[PATCH] powerpc: don't add memory to empty node/zone
authorMike Kravetz <kravetz@us.ibm.com>
Fri, 16 Dec 2005 22:30:35 +0000 (14:30 -0800)
committerPaul Mackerras <paulus@samba.org>
Mon, 9 Jan 2006 04:14:22 +0000 (15:14 +1100)
The system will oops if an attempt is made to add memory to an
empty node/zone.  This patch prevents adding memory to an empty
node.  The code to dynamically add a node/zone is non-trivial.
This patch is temporary and will be removed when the ability
to dynamically add a node/zone is complete.

Signed-off-by: Mike Kravetz <kravetz@us.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/mm/numa.c

index fc6f8ee9656fa809f98bc2e00bf066201b337a24..2863a912bcd0950d3841d62c035110aa0f5b8d3a 100644 (file)
@@ -766,13 +766,15 @@ early_param("numa", early_numa);
 int hot_add_scn_to_nid(unsigned long scn_addr)
 {
        struct device_node *memory = NULL;
+       nodemask_t nodes;
+       int numa_domain = 0;
 
        if (!numa_enabled || (min_common_depth < 0))
-               return 0;
+               return numa_domain;
 
        while ((memory = of_find_node_by_type(memory, "memory")) != NULL) {
                unsigned long start, size;
-               int numa_domain, ranges;
+               int ranges;
                unsigned int *memcell_buf;
                unsigned int len;
 
@@ -793,14 +795,21 @@ ha_new_range:
 
                if ((scn_addr >= start) && (scn_addr < (start + size))) {
                        of_node_put(memory);
-                       return numa_domain;
+                       goto got_numa_domain;
                }
 
                if (--ranges)           /* process all ranges in cell */
                        goto ha_new_range;
        }
-
        BUG();  /* section address should be found above */
-       return 0;
+
+       /* Temporary code to ensure that returned node is not empty */
+got_numa_domain:
+       nodes_setall(nodes);
+       while (NODE_DATA(numa_domain)->node_spanned_pages == 0) {
+               node_clear(numa_domain, nodes);
+               numa_domain = any_online_node(nodes);
+       }
+       return numa_domain;
 }
 #endif /* CONFIG_MEMORY_HOTPLUG */