From: Dave Hansen <haveblue@us.ibm.com>

Rick, I bet you didn't think your nerf weapons would be so effective in
getting that compile error fixed, did you?

Applying the attached patch and commenting out this line:

arch/i386/kernel/nmi.c: In function `proc_unknown_nmi_panic':
arch/i386/kernel/nmi.c:558: too few arguments to function
`proc_dointvec'

will let it compile.  

I'm taking a look at the nmi.c error now, although I think it's
unrelated.

My testing of the original patch was flawed from the beginning because I
never tested them in isolation.  If you haven't already, you should
probably drop them.  I'll rework and make sure to get testing on a wider
variety of arches. 

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/arch/alpha/mm/numa.c             |    2 -
 25-akpm/arch/arm/mm/init.c               |    2 -
 25-akpm/arch/ia64/mm/contig.c            |    5 +--
 25-akpm/arch/ia64/mm/discontig.c         |    3 +-
 25-akpm/arch/ia64/mm/init.c              |   10 +++----
 25-akpm/arch/mips/sgi-ip27/ip27-memory.c |    2 -
 25-akpm/arch/parisc/mm/init.c            |    2 -
 25-akpm/arch/ppc64/mm/init.c             |    2 -
 25-akpm/arch/sh/mm/init.c                |    2 -
 25-akpm/arch/sparc/mm/srmmu.c            |    2 -
 25-akpm/arch/sparc/mm/sun4c.c            |    2 -
 25-akpm/arch/sparc64/mm/init.c           |    2 -
 25-akpm/arch/x86_64/mm/numa.c            |    2 -
 25-akpm/include/asm-ia64/pgtable.h       |    2 -
 25-akpm/include/linux/mm.h               |    5 ++-
 25-akpm/mm/page_alloc.c                  |   41 +++++++++++++------------------
 16 files changed, 40 insertions(+), 46 deletions(-)

diff -puN arch/alpha/mm/numa.c~dont-pass-mem_map-into-init-functions-even-more-fixes arch/alpha/mm/numa.c
--- 25/arch/alpha/mm/numa.c~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.509812792 -0700
+++ 25-akpm/arch/alpha/mm/numa.c	2004-08-15 22:49:31.534808992 -0700
@@ -313,7 +313,7 @@ void __init paging_init(void)
 			zones_size[ZONE_DMA] = dma_local_pfn;
 			zones_size[ZONE_NORMAL] = (end_pfn - start_pfn) - dma_local_pfn;
 		}
-		free_area_init_node(nid, NODE_DATA(nid), zones_size, start_pfn, NULL);
+		free_area_init_node(nid, NODE_DATA(nid), NULL, zones_size, start_pfn, NULL);
 	}
 
 	/* Initialize the kernel's ZERO_PGE. */
diff -puN arch/arm/mm/init.c~dont-pass-mem_map-into-init-functions-even-more-fixes arch/arm/mm/init.c
--- 25/arch/arm/mm/init.c~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.511812488 -0700
+++ 25-akpm/arch/arm/mm/init.c	2004-08-15 22:49:31.535808840 -0700
@@ -495,7 +495,7 @@ void __init paging_init(struct meminfo *
 		 */
 		arch_adjust_zones(node, zone_size, zhole_size);
 
-		free_area_init_node(node, pgdat, zone_size,
+		free_area_init_node(node, pgdat, NULL, zone_size,
 				bdata->node_boot_start >> PAGE_SHIFT, zhole_size);
 	}
 
diff -puN arch/ia64/mm/contig.c~dont-pass-mem_map-into-init-functions-even-more-fixes arch/ia64/mm/contig.c
--- 25/arch/ia64/mm/contig.c~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.512812336 -0700
+++ 25-akpm/arch/ia64/mm/contig.c	2004-08-15 22:49:31.535808840 -0700
@@ -267,7 +267,7 @@ paging_init (void)
 	efi_memmap_walk(find_largest_hole, (u64 *)&max_gap);
 	if (max_gap < LARGE_GAP) {
 		vmem_map = (struct page *) 0;
-		free_area_init_node(0, &contig_page_data, zones_size, 0,
+		free_area_init_node(0, &contig_page_data, NULL, zones_size, 0,
 				    zholes_size);
 		mem_map = contig_page_data.node_mem_map;
 	} else {
@@ -280,8 +280,7 @@ paging_init (void)
 		vmem_map = (struct page *) vmalloc_end;
 		efi_memmap_walk(create_mem_map_page_table, 0);
 
-		contig_page_data.node_mem_map = vmem_map;
-		free_area_init_node(0, &contig_page_data, zones_size,
+		free_area_init_node(0, &contig_page_data, vmem_map, zones_size,
 				    0, zholes_size);
 
 		mem_map = contig_page_data.node_mem_map;
diff -puN arch/ia64/mm/discontig.c~dont-pass-mem_map-into-init-functions-even-more-fixes arch/ia64/mm/discontig.c
--- 25/arch/ia64/mm/discontig.c~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.513812184 -0700
+++ 25-akpm/arch/ia64/mm/discontig.c	2004-08-15 22:49:31.536808688 -0700
@@ -665,7 +665,8 @@ void paging_init(void)
 
 		pfn_offset = mem_data[node].min_pfn;
 
-		free_area_init_node(node, NODE_DATA(node), zones_size,
+		free_area_init_node(node, NODE_DATA(node),
+				    vmem_map + pfn_offset, zones_size,
 				    pfn_offset, zholes_size);
 	}
 
diff -puN arch/ia64/mm/init.c~dont-pass-mem_map-into-init-functions-even-more-fixes arch/ia64/mm/init.c
--- 25/arch/ia64/mm/init.c~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.515811880 -0700
+++ 25-akpm/arch/ia64/mm/init.c	2004-08-15 22:49:31.537808536 -0700
@@ -429,22 +429,20 @@ virtual_memmap_init (u64 start, u64 end,
 		    / sizeof(struct page));
 
 	if (map_start < map_end)
-		memmap_init_zone((unsigned long)(map_end - map_start),
+		memmap_init_zone(map_start, (unsigned long) (map_end - map_start),
 				 args->nid, args->zone, page_to_pfn(map_start));
 	return 0;
 }
 
 void
-memmap_init (unsigned long size, int nid, unsigned long zone,
-	     unsigned long start_pfn)
+memmap_init (struct page *start, unsigned long size, int nid,
+	     unsigned long zone, unsigned long start_pfn)
 {
 	if (!vmem_map)
-		memmap_init_zone(size, nid, zone, start_pfn);
+		memmap_init_zone(start, size, nid, zone, start_pfn);
 	else {
-		struct page *start;
 		struct memmap_init_callback_data args;
 
-		start = pfn_to_page(start_pfn);
 		args.start = start;
 		args.end = start + size;
 		args.nid = nid;
diff -puN arch/mips/sgi-ip27/ip27-memory.c~dont-pass-mem_map-into-init-functions-even-more-fixes arch/mips/sgi-ip27/ip27-memory.c
--- 25/arch/mips/sgi-ip27/ip27-memory.c~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.516811728 -0700
+++ 25-akpm/arch/mips/sgi-ip27/ip27-memory.c	2004-08-15 22:49:31.537808536 -0700
@@ -225,7 +225,7 @@ void __init paging_init(void)
 		pfn_t end_pfn = node_getmaxclick(node) + 1;
 
 		zones_size[ZONE_DMA] = end_pfn - start_pfn;
-		free_area_init_node(node, NODE_DATA(node),
+		free_area_init_node(node, NODE_DATA(node), NULL,
 				zones_size, start_pfn, NULL);
 
 		if (end_pfn > max_low_pfn)
diff -puN arch/parisc/mm/init.c~dont-pass-mem_map-into-init-functions-even-more-fixes arch/parisc/mm/init.c
--- 25/arch/parisc/mm/init.c~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.518811424 -0700
+++ 25-akpm/arch/parisc/mm/init.c	2004-08-15 22:49:31.538808384 -0700
@@ -804,7 +804,7 @@ void __init paging_init(void)
 		   ZONE_DMA zone. */
 		zones_size[ZONE_DMA] = pmem_ranges[i].pages;
 
-		free_area_init_node(i, NODE_DATA(i), zones_size,
+		free_area_init_node(i, NODE_DATA(i), NULL, zones_size,
 				pmem_ranges[i].start_pfn, 0);
 
 #ifdef CONFIG_DISCONTIGMEM
diff -puN arch/ppc64/mm/init.c~dont-pass-mem_map-into-init-functions-even-more-fixes arch/ppc64/mm/init.c
--- 25/arch/ppc64/mm/init.c~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.519811272 -0700
+++ 25-akpm/arch/ppc64/mm/init.c	2004-08-15 22:49:31.539808232 -0700
@@ -587,7 +587,7 @@ void __init paging_init(void)
 	zones_size[ZONE_DMA] = top_of_ram >> PAGE_SHIFT;
 	zholes_size[ZONE_DMA] = (top_of_ram - total_ram) >> PAGE_SHIFT;
 
-	free_area_init_node(0, &contig_page_data, zones_size,
+	free_area_init_node(0, &contig_page_data, NULL, zones_size,
 			    __pa(PAGE_OFFSET) >> PAGE_SHIFT, zholes_size);
 	mem_map = contig_page_data.node_mem_map;
 }
diff -puN arch/sh/mm/init.c~dont-pass-mem_map-into-init-functions-even-more-fixes arch/sh/mm/init.c
--- 25/arch/sh/mm/init.c~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.520811120 -0700
+++ 25-akpm/arch/sh/mm/init.c	2004-08-15 22:49:31.539808232 -0700
@@ -225,7 +225,7 @@ void __init paging_init(void)
 	 */
 	zones_size[ZONE_DMA] = __MEMORY_SIZE_2ND >> PAGE_SHIFT;
 	zones_size[ZONE_NORMAL] = 0;
-	free_area_init_node(1, NODE_DATA(1), zones_size, __MEMORY_START_2ND >> PAGE_SHIFT, 0);
+	free_area_init_node(1, NODE_DATA(1), 0, zones_size, __MEMORY_START_2ND >> PAGE_SHIFT, 0);
 #endif
 }
 
diff -puN arch/sparc64/mm/init.c~dont-pass-mem_map-into-init-functions-even-more-fixes arch/sparc64/mm/init.c
--- 25/arch/sparc64/mm/init.c~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.522810816 -0700
+++ 25-akpm/arch/sparc64/mm/init.c	2004-08-15 22:49:31.541807928 -0700
@@ -1502,7 +1502,7 @@ void __init paging_init(void)
 		zones_size[ZONE_DMA] = npages;
 		zholes_size[ZONE_DMA] = npages - pages_avail;
 
-		free_area_init_node(0, &contig_page_data, zones_size,
+		free_area_init_node(0, &contig_page_data, NULL, zones_size,
 				    phys_base >> PAGE_SHIFT, zholes_size);
 		mem_map = contig_page_data.node_mem_map;
 	}
diff -puN arch/sparc/mm/srmmu.c~dont-pass-mem_map-into-init-functions-even-more-fixes arch/sparc/mm/srmmu.c
--- 25/arch/sparc/mm/srmmu.c~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.523810664 -0700
+++ 25-akpm/arch/sparc/mm/srmmu.c	2004-08-15 22:49:31.542807776 -0700
@@ -1341,7 +1341,7 @@ void __init srmmu_paging_init(void)
 		zones_size[ZONE_HIGHMEM] = npages;
 		zholes_size[ZONE_HIGHMEM] = npages - calc_highpages();
 
-		free_area_init_node(0, &contig_page_data, zones_size,
+		free_area_init_node(0, &contig_page_data, NULL, zones_size,
 				    pfn_base, zholes_size);
 		mem_map = contig_page_data.node_mem_map;
 	}
diff -puN arch/sparc/mm/sun4c.c~dont-pass-mem_map-into-init-functions-even-more-fixes arch/sparc/mm/sun4c.c
--- 25/arch/sparc/mm/sun4c.c~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.525810360 -0700
+++ 25-akpm/arch/sparc/mm/sun4c.c	2004-08-15 22:49:31.544807472 -0700
@@ -2114,7 +2114,7 @@ void __init sun4c_paging_init(void)
 		zones_size[ZONE_HIGHMEM] = npages;
 		zholes_size[ZONE_HIGHMEM] = npages - calc_highpages();
 
-		free_area_init_node(0, &contig_page_data, zones_size,
+		free_area_init_node(0, &contig_page_data, NULL, zones_size,
 				    pfn_base, zholes_size);
 		mem_map = contig_page_data.node_mem_map;
 	}
diff -puN arch/x86_64/mm/numa.c~dont-pass-mem_map-into-init-functions-even-more-fixes arch/x86_64/mm/numa.c
--- 25/arch/x86_64/mm/numa.c~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.526810208 -0700
+++ 25-akpm/arch/x86_64/mm/numa.c	2004-08-15 22:49:31.545807320 -0700
@@ -136,7 +136,7 @@ void __init setup_node_zones(int nodeid)
 		zones[ZONE_NORMAL] = end_pfn - start_pfn; 
 	} 
     
-	free_area_init_node(nodeid, NODE_DATA(nodeid), zones,
+	free_area_init_node(nodeid, NODE_DATA(nodeid), NULL, zones,
 			    start_pfn, NULL); 
 } 
 
diff -puN include/asm-ia64/pgtable.h~dont-pass-mem_map-into-init-functions-even-more-fixes include/asm-ia64/pgtable.h
--- 25/include/asm-ia64/pgtable.h~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.528809904 -0700
+++ 25-akpm/include/asm-ia64/pgtable.h	2004-08-15 22:49:31.545807320 -0700
@@ -520,7 +520,7 @@ do {											\
 #  ifdef CONFIG_VIRTUAL_MEM_MAP
   /* arch mem_map init routine is needed due to holes in a virtual mem_map */
 #   define __HAVE_ARCH_MEMMAP_INIT
-    extern void memmap_init (unsigned long size, int nid, unsigned long zone,
+    extern void memmap_init (struct page *start, unsigned long size, int nid, unsigned long zone,
 			     unsigned long start_pfn);
 #  endif /* CONFIG_VIRTUAL_MEM_MAP */
 # endif /* !__ASSEMBLY__ */
diff -puN include/linux/mm.h~dont-pass-mem_map-into-init-functions-even-more-fixes include/linux/mm.h
--- 25/include/linux/mm.h~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.529809752 -0700
+++ 25-akpm/include/linux/mm.h	2004-08-15 22:49:31.546807168 -0700
@@ -594,10 +594,11 @@ static inline pmd_t *pmd_alloc(struct mm
 }
 
 extern void free_area_init(unsigned long * zones_size);
-extern void free_area_init_node(int nid, pg_data_t *pgdat,
+extern void free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap,
 	unsigned long * zones_size, unsigned long zone_start_pfn, 
 	unsigned long *zholes_size);
-extern void memmap_init_zone(unsigned long, int, unsigned long, unsigned long);
+extern void memmap_init_zone(struct page *, unsigned long, int,
+	unsigned long, unsigned long);
 extern void mem_init(void);
 extern void show_mem(void);
 extern void si_meminfo(struct sysinfo * val);
diff -puN mm/page_alloc.c~dont-pass-mem_map-into-init-functions-even-more-fixes mm/page_alloc.c
--- 25/mm/page_alloc.c~dont-pass-mem_map-into-init-functions-even-more-fixes	2004-08-15 22:49:31.531809448 -0700
+++ 25-akpm/mm/page_alloc.c	2004-08-15 22:49:31.548806864 -0700
@@ -1385,10 +1385,9 @@ static void __init calculate_zone_totalp
  * up by free_all_bootmem() once the early boot process is
  * done. Non-atomic initialization, single-pass.
  */
-void __init memmap_init_zone(unsigned long size, int nid, unsigned long zone,
-		unsigned long start_pfn)
+void __init memmap_init_zone(struct page *start, unsigned long size, int nid,
+		unsigned long zone, unsigned long start_pfn)
 {
-	struct page *start = pfn_to_page(start_pfn);
 	struct page *page;
 
 	for (page = start; page < (start + size); page++) {
@@ -1452,8 +1451,8 @@ void zone_init_free_lists(struct pglist_
 }
 
 #ifndef __HAVE_ARCH_MEMMAP_INIT
-#define memmap_init(size, nid, zone, start_pfn) \
-	memmap_init_zone((size), (nid), (zone), (start_pfn))
+#define memmap_init(start, size, nid, zone, start_pfn) \
+	memmap_init_zone((start), (size), (nid), (zone), (start_pfn))
 #endif
 
 /*
@@ -1468,6 +1467,7 @@ static void __init free_area_init_core(s
 	unsigned long i, j;
 	const unsigned long zone_required_alignment = 1UL << (MAX_ORDER-1);
 	int cpu, nid = pgdat->node_id;
+	struct page *lmem_map = pgdat->node_mem_map;
 	unsigned long zone_start_pfn = pgdat->node_start_pfn;
 
 	pgdat->nr_zones = 0;
@@ -1555,41 +1555,35 @@ static void __init free_area_init_core(s
 
 		pgdat->nr_zones = j+1;
 
-		zone->zone_mem_map = pfn_to_page(zone_start_pfn);
+		zone->zone_mem_map = lmem_map;
 		zone->zone_start_pfn = zone_start_pfn;
 
 		if ((zone_start_pfn) & (zone_required_alignment-1))
 			printk("BUG: wrong zone alignment, it will crash\n");
 
-		memmap_init(size, nid, j, zone_start_pfn);
+		memmap_init(lmem_map, size, nid, j, zone_start_pfn);
 
 		zone_start_pfn += size;
+		lmem_map += size;
 
 		zone_init_free_lists(pgdat, zone, zone->spanned_pages);
 	}
 }
 
-void __init node_alloc_mem_map(struct pglist_data *pgdat)
+void __init free_area_init_node(int nid, struct pglist_data *pgdat,
+		struct page *node_mem_map, unsigned long *zones_size,
+		unsigned long node_start_pfn, unsigned long *zholes_size)
 {
 	unsigned long size;
 
-	size = (pgdat->node_spanned_pages + 1) * sizeof(struct page);
-	pgdat->node_mem_map = alloc_bootmem_node(pgdat, size);
-#ifndef CONFIG_DISCONTIGMEM
-	mem_map = contig_page_data.node_mem_map;
-#endif
-}
-
-void __init free_area_init_node(int nid, struct pglist_data *pgdat,
-		unsigned long *zones_size, unsigned long node_start_pfn,
-		unsigned long *zholes_size)
-{
 	pgdat->node_id = nid;
 	pgdat->node_start_pfn = node_start_pfn;
 	calculate_zone_totalpages(pgdat, zones_size, zholes_size);
-
-	if (!pfn_to_page(node_start_pfn))
-		node_alloc_mem_map(pgdat);
+	if (!node_mem_map) {
+		size = (pgdat->node_spanned_pages + 1) * sizeof(struct page);
+		node_mem_map = alloc_bootmem_node(pgdat, size);
+	}
+	pgdat->node_mem_map = node_mem_map;
 
 	free_area_init_core(pgdat, zones_size, zholes_size);
 }
@@ -1602,8 +1596,9 @@ EXPORT_SYMBOL(contig_page_data);
 
 void __init free_area_init(unsigned long *zones_size)
 {
-	free_area_init_node(0, &contig_page_data, zones_size,
+	free_area_init_node(0, &contig_page_data, NULL, zones_size,
 			__pa(PAGE_OFFSET) >> PAGE_SHIFT, NULL);
+	mem_map = contig_page_data.node_mem_map;
 }
 #endif
 
_