As I said earlier, I'm trying to restrict the use of NODE_DATA()
since it can easily be referenced too early otherwise.

free_bootmem_with_active_regions() does not in practice need to
deal with multiple nodes.  I already audited all of its callers.

This patch makes it take a pgdat instead of doing the NODE_DATA()
lookup internally.

Signed-off-by: Dave Hansen <[EMAIL PROTECTED]>
---

 linux-2.6.git-dave/arch/mips/sgi-ip27/ip27-memory.c |    2 +-
 linux-2.6.git-dave/arch/powerpc/mm/mem.c            |    5 +++--
 linux-2.6.git-dave/arch/powerpc/mm/numa.c           |    3 +--
 linux-2.6.git-dave/arch/s390/kernel/setup.c         |    2 +-
 linux-2.6.git-dave/arch/sh/mm/numa.c                |    2 +-
 linux-2.6.git-dave/arch/sparc64/mm/init.c           |    6 +++---
 linux-2.6.git-dave/arch/x86/mm/init_32.c            |    2 +-
 linux-2.6.git-dave/arch/x86/mm/init_64.c            |    2 +-
 linux-2.6.git-dave/arch/x86/mm/numa_64.c            |    2 +-
 linux-2.6.git-dave/include/linux/mm.h               |    2 +-
 linux-2.6.git-dave/mm/page_alloc.c                  |    8 ++++----
 11 files changed, 18 insertions(+), 18 deletions(-)

diff -puN 
arch/mips/sgi-ip27/ip27-memory.c~make-free_bootmem_with_active_regions-take-pgdat
 arch/mips/sgi-ip27/ip27-memory.c
--- 
linux-2.6.git/arch/mips/sgi-ip27/ip27-memory.c~make-free_bootmem_with_active_regions-take-pgdat
     2008-12-09 10:16:08.000000000 -0800
+++ linux-2.6.git-dave/arch/mips/sgi-ip27/ip27-memory.c 2008-12-09 
10:16:08.000000000 -0800
@@ -412,7 +412,7 @@ static void __init node_mem_init(cnodeid
 
        bootmap_size = init_bootmem_node(NODE_DATA(node), slot_freepfn,
                                        start_pfn, end_pfn);
-       free_bootmem_with_active_regions(node, end_pfn);
+       free_bootmem_with_active_regions(NODE_DATA(node), end_pfn);
        reserve_bootmem_node(NODE_DATA(node), slot_firstpfn << PAGE_SHIFT,
                ((slot_freepfn - slot_firstpfn) << PAGE_SHIFT) + bootmap_size,
                BOOTMEM_DEFAULT);
diff -puN 
arch/powerpc/mm/mem.c~make-free_bootmem_with_active_regions-take-pgdat 
arch/powerpc/mm/mem.c
--- 
linux-2.6.git/arch/powerpc/mm/mem.c~make-free_bootmem_with_active_regions-take-pgdat
        2008-12-09 10:16:08.000000000 -0800
+++ linux-2.6.git-dave/arch/powerpc/mm/mem.c    2008-12-09 10:16:08.000000000 
-0800
@@ -212,7 +212,8 @@ void __init do_init_bootmem(void)
         * present.
         */
 #ifdef CONFIG_HIGHMEM
-       free_bootmem_with_active_regions(0, lowmem_end_addr >> PAGE_SHIFT);
+       free_bootmem_with_active_regions(NODE_DATA(0),
+                                        lowmem_end_addr >> PAGE_SHIFT);
 
        /* reserve the sections we're already using */
        for (i = 0; i < lmb.reserved.cnt; i++) {
@@ -230,7 +231,7 @@ void __init do_init_bootmem(void)
                }
        }
 #else
-       free_bootmem_with_active_regions(0, max_pfn);
+       free_bootmem_with_active_regions(NODE_DATA(0), max_pfn);
 
        /* reserve the sections we're already using */
        for (i = 0; i < lmb.reserved.cnt; i++)
diff -puN 
arch/powerpc/mm/numa.c~make-free_bootmem_with_active_regions-take-pgdat 
arch/powerpc/mm/numa.c
--- 
linux-2.6.git/arch/powerpc/mm/numa.c~make-free_bootmem_with_active_regions-take-pgdat
       2008-12-09 10:16:08.000000000 -0800
+++ linux-2.6.git-dave/arch/powerpc/mm/numa.c   2008-12-09 10:16:08.000000000 
-0800
@@ -978,8 +978,6 @@ void do_init_bootmem_node(int nid)
        init_bootmem_node(node, __pa(bootmem_vaddr) >> PAGE_SHIFT,
                          start_pfn, end_pfn);
 
-       NODE_DATA(nid) = node;
-       /* this call needs NODE_DATA(), so initialize it above */
        free_bootmem_with_active_regions(nid, end_pfn);
        mark_reserved_regions_for_node(node);
        /*
@@ -988,6 +986,7 @@ void do_init_bootmem_node(int nid)
         * careful_zallocation() depends on this getting set
         * now to tell from which nodes it must use bootmem.
         */
+       NODE_DATA(nid) = node;
        sparse_memory_present_with_active_regions(nid);
 }
 
diff -puN 
arch/s390/kernel/setup.c~make-free_bootmem_with_active_regions-take-pgdat 
arch/s390/kernel/setup.c
--- 
linux-2.6.git/arch/s390/kernel/setup.c~make-free_bootmem_with_active_regions-take-pgdat
     2008-12-09 10:16:08.000000000 -0800
+++ linux-2.6.git-dave/arch/s390/kernel/setup.c 2008-12-09 10:16:08.000000000 
-0800
@@ -616,7 +616,7 @@ setup_memory(void)
 
        psw_set_key(PAGE_DEFAULT_KEY);
 
-       free_bootmem_with_active_regions(0, max_pfn);
+       free_bootmem_with_active_regions(NODE_DATA(0), max_pfn);
 
        /*
         * Reserve memory used for lowcore/command line/kernel image.
diff -puN arch/sh/mm/numa.c~make-free_bootmem_with_active_regions-take-pgdat 
arch/sh/mm/numa.c
--- 
linux-2.6.git/arch/sh/mm/numa.c~make-free_bootmem_with_active_regions-take-pgdat
    2008-12-09 10:16:08.000000000 -0800
+++ linux-2.6.git-dave/arch/sh/mm/numa.c        2008-12-09 10:16:08.000000000 
-0800
@@ -75,7 +75,7 @@ void __init setup_bootmem_node(int nid, 
        bootmap_size = init_bootmem_node(NODE_DATA(nid), free_pfn, start_pfn,
                                    end_pfn);
 
-       free_bootmem_with_active_regions(nid, end_pfn);
+       free_bootmem_with_active_regions(NODE_DATA(nid), end_pfn);
 
        /* Reserve the pgdat and bootmap space with the bootmem allocator */
        reserve_bootmem_node(NODE_DATA(nid), start_pfn << PAGE_SHIFT,
diff -puN 
arch/sparc64/mm/init.c~make-free_bootmem_with_active_regions-take-pgdat 
arch/sparc64/mm/init.c
--- 
linux-2.6.git/arch/sparc64/mm/init.c~make-free_bootmem_with_active_regions-take-pgdat
       2008-12-09 10:16:08.000000000 -0800
+++ linux-2.6.git-dave/arch/sparc64/mm/init.c   2008-12-09 10:16:08.000000000 
-0800
@@ -1353,9 +1353,9 @@ static void __init bootmem_init_one_node
                init_bootmem_node(p, paddr >> PAGE_SHIFT,
                                  p->node_start_pfn, end_pfn);
 
-               numadbg("  free_bootmem_with_active_regions(%d, %lx)\n",
-                       nid, end_pfn);
-               free_bootmem_with_active_regions(nid, end_pfn);
+               numadbg("  free_bootmem_with_active_regions(%p, %lx)\n",
+                       p, end_pfn);
+               free_bootmem_with_active_regions(p, end_pfn);
 
                trim_reserved_in_node(nid);
 
diff -puN 
arch/x86/mm/init_32.c~make-free_bootmem_with_active_regions-take-pgdat 
arch/x86/mm/init_32.c
--- 
linux-2.6.git/arch/x86/mm/init_32.c~make-free_bootmem_with_active_regions-take-pgdat
        2008-12-09 10:16:08.000000000 -0800
+++ linux-2.6.git-dave/arch/x86/mm/init_32.c    2008-12-09 10:16:08.000000000 
-0800
@@ -768,7 +768,7 @@ void __init setup_bootmem_allocator(void
        printk(KERN_INFO "  bootmap %08lx - %08lx\n",
                 bootmap, bootmap + bootmap_size);
        for_each_online_node(i)
-               free_bootmem_with_active_regions(i, max_low_pfn);
+               free_bootmem_with_active_regions(NODE_DATA(i), max_low_pfn);
        early_res_to_bootmem(0, max_low_pfn<<PAGE_SHIFT);
 
        after_init_bootmem = 1;
diff -puN 
arch/x86/mm/init_64.c~make-free_bootmem_with_active_regions-take-pgdat 
arch/x86/mm/init_64.c
--- 
linux-2.6.git/arch/x86/mm/init_64.c~make-free_bootmem_with_active_regions-take-pgdat
        2008-12-09 10:16:08.000000000 -0800
+++ linux-2.6.git-dave/arch/x86/mm/init_64.c    2008-12-09 10:16:08.000000000 
-0800
@@ -817,7 +817,7 @@ void __init initmem_init(unsigned long s
        bootmap_size = init_bootmem_node(NODE_DATA(0), bootmap >> PAGE_SHIFT,
                                         0, end_pfn);
        e820_register_active_regions(0, start_pfn, end_pfn);
-       free_bootmem_with_active_regions(0, end_pfn);
+       free_bootmem_with_active_regions(NODE_DATA(0), end_pfn);
        early_res_to_bootmem(0, end_pfn<<PAGE_SHIFT);
        reserve_bootmem(bootmap, bootmap_size, BOOTMEM_DEFAULT);
 }
diff -puN 
arch/x86/mm/numa_64.c~make-free_bootmem_with_active_regions-take-pgdat 
arch/x86/mm/numa_64.c
--- 
linux-2.6.git/arch/x86/mm/numa_64.c~make-free_bootmem_with_active_regions-take-pgdat
        2008-12-09 10:16:08.000000000 -0800
+++ linux-2.6.git-dave/arch/x86/mm/numa_64.c    2008-12-09 10:16:08.000000000 
-0800
@@ -235,7 +235,7 @@ void __init setup_node_bootmem(int nodei
                 bootmap_start, bootmap_start + bootmap_size - 1,
                 bootmap_pages);
 
-       free_bootmem_with_active_regions(nodeid, end);
+       free_bootmem_with_active_regions(NODE_DATA(nodeid), end);
 
        /*
         * convert early reserve to bootmem reserve earlier
diff -puN include/linux/mm.h~make-free_bootmem_with_active_regions-take-pgdat 
include/linux/mm.h
--- 
linux-2.6.git/include/linux/mm.h~make-free_bootmem_with_active_regions-take-pgdat
   2008-12-09 10:16:08.000000000 -0800
+++ linux-2.6.git-dave/include/linux/mm.h       2008-12-09 10:16:08.000000000 
-0800
@@ -1023,7 +1023,7 @@ extern unsigned long absent_pages_in_ran
 extern void get_pfn_range_for_nid(unsigned int nid,
                        unsigned long *start_pfn, unsigned long *end_pfn);
 extern unsigned long find_min_pfn_with_active_regions(void);
-extern void free_bootmem_with_active_regions(int nid,
+extern void free_bootmem_with_active_regions(struct pglist_data *node,
                                                unsigned long max_low_pfn);
 typedef int (*work_fn_t)(unsigned long, unsigned long, void *);
 extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data);
diff -puN mm/page_alloc.c~make-free_bootmem_with_active_regions-take-pgdat 
mm/page_alloc.c
--- 
linux-2.6.git/mm/page_alloc.c~make-free_bootmem_with_active_regions-take-pgdat  
    2008-12-09 10:16:08.000000000 -0800
+++ linux-2.6.git-dave/mm/page_alloc.c  2008-12-09 10:16:08.000000000 -0800
@@ -2997,16 +2997,17 @@ int __meminit early_pfn_to_nid(unsigned 
 
 /**
  * free_bootmem_with_active_regions - Call free_bootmem_node for each active 
range
- * @nid: The node to free memory on. If MAX_NUMNODES, all nodes are freed.
+ * @node: The node on which to free memory.
  * @max_low_pfn: The highest PFN that will be passed to free_bootmem_node
  *
  * If an architecture guarantees that all ranges registered with
  * add_active_ranges() contain no holes and may be freed, this
  * this function may be used instead of calling free_bootmem() manually.
  */
-void __init free_bootmem_with_active_regions(int nid,
+void __init free_bootmem_with_active_regions(struct pglist_data *node,
                                                unsigned long max_low_pfn)
 {
+       int nid = node->node_id;
        int i;
 
        for_each_active_range_index_in_nid(i, nid) {
@@ -3020,8 +3021,7 @@ void __init free_bootmem_with_active_reg
                        end_pfn = max_low_pfn;
 
                size_pages = end_pfn - early_node_map[i].start_pfn;
-               free_bootmem_node(NODE_DATA(early_node_map[i].nid),
-                               PFN_PHYS(early_node_map[i].start_pfn),
+               free_bootmem_node(node, PFN_PHYS(early_node_map[i].start_pfn),
                                size_pages << PAGE_SHIFT);
        }
 }
_
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to