]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/powerpc/mm/numa.c
powerpc/numa: Make memory reserve code more robust
[linux-2.6-omap-h63xx.git] / arch / powerpc / mm / numa.c
index 6cf5c71c431fddc43d33ba920753023d847a991e..195bfcd08959a4eac2dd9f2ebc2a7e8aa8e9d09c 100644 (file)
@@ -116,6 +116,7 @@ static int __init get_active_region_work_fn(unsigned long start_pfn,
 
 /*
  * get_node_active_region - Return active region containing start_pfn
+ * Active range returned is empty if none found.
  * @start_pfn: The page to return the region for.
  * @node_ar: Returned set to the active region containing start_pfn
  */
@@ -126,6 +127,7 @@ static void __init get_node_active_region(unsigned long start_pfn,
 
        node_ar->nid = nid;
        node_ar->start_pfn = start_pfn;
+       node_ar->end_pfn = start_pfn;
        work_with_active_regions(nid, get_active_region_work_fn, node_ar);
 }
 
@@ -933,18 +935,20 @@ void __init do_init_bootmem(void)
                struct node_active_region node_ar;
 
                get_node_active_region(start_pfn, &node_ar);
-               while (start_pfn < end_pfn) {
+               while (start_pfn < end_pfn &&
+                       node_ar.start_pfn < node_ar.end_pfn) {
+                       unsigned long reserve_size = size;
                        /*
                         * if reserved region extends past active region
                         * then trim size to active region
                         */
                        if (end_pfn > node_ar.end_pfn)
-                               size = (node_ar.end_pfn << PAGE_SHIFT)
+                               reserve_size = (node_ar.end_pfn << PAGE_SHIFT)
                                        - (start_pfn << PAGE_SHIFT);
-                       dbg("reserve_bootmem %lx %lx nid=%d\n", physbase, size,
-                               node_ar.nid);
+                       dbg("reserve_bootmem %lx %lx nid=%d\n", physbase,
+                               reserve_size, node_ar.nid);
                        reserve_bootmem_node(NODE_DATA(node_ar.nid), physbase,
-                                               size, BOOTMEM_DEFAULT);
+                                               reserve_size, BOOTMEM_DEFAULT);
                        /*
                         * if reserved region is contained in the active region
                         * then done.
@@ -959,6 +963,7 @@ void __init do_init_bootmem(void)
                         */
                        start_pfn = node_ar.end_pfn;
                        physbase = start_pfn << PAGE_SHIFT;
+                       size = size - reserve_size;
                        get_node_active_region(start_pfn, &node_ar);
                }