From: Dave Hansen 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 --- 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-09 22:02:15.731237536 -0700 +++ 25-akpm/arch/alpha/mm/numa.c 2004-08-09 22:02:15.756233736 -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-09 22:02:15.732237384 -0700 +++ 25-akpm/arch/arm/mm/init.c 2004-08-09 22:02:15.757233584 -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-09 22:02:15.734237080 -0700 +++ 25-akpm/arch/ia64/mm/contig.c 2004-08-09 22:02:15.757233584 -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-09 22:02:15.735236928 -0700 +++ 25-akpm/arch/ia64/mm/discontig.c 2004-08-09 22:02:15.758233432 -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-09 22:02:15.737236624 -0700 +++ 25-akpm/arch/ia64/mm/init.c 2004-08-09 22:02:15.759233280 -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-09 22:02:15.738236472 -0700 +++ 25-akpm/arch/mips/sgi-ip27/ip27-memory.c 2004-08-09 22:02:15.759233280 -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-09 22:02:15.739236320 -0700 +++ 25-akpm/arch/parisc/mm/init.c 2004-08-09 22:02:15.760233128 -0700 @@ -761,7 +761,7 @@ void __init paging_init(void) unsigned long zones_size[MAX_NR_ZONES] = { 0, 0, 0, }; 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 << PAGE_SHIFT),0); } 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-09 22:02:15.741236016 -0700 +++ 25-akpm/arch/ppc64/mm/init.c 2004-08-09 22:02:15.761232976 -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-09 22:02:15.742235864 -0700 +++ 25-akpm/arch/sh/mm/init.c 2004-08-09 22:02:15.761232976 -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-09 22:02:15.744235560 -0700 +++ 25-akpm/arch/sparc64/mm/init.c 2004-08-09 22:02:15.763232672 -0700 @@ -1585,7 +1585,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-09 22:02:15.745235408 -0700 +++ 25-akpm/arch/sparc/mm/srmmu.c 2004-08-09 22:02:15.765232368 -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-09 22:02:15.747235104 -0700 +++ 25-akpm/arch/sparc/mm/sun4c.c 2004-08-09 22:02:15.766232216 -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-09 22:02:15.748234952 -0700 +++ 25-akpm/arch/x86_64/mm/numa.c 2004-08-09 22:02:15.767232064 -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-09 22:02:15.750234648 -0700 +++ 25-akpm/include/asm-ia64/pgtable.h 2004-08-09 22:02:15.767232064 -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-09 22:02:15.751234496 -0700 +++ 25-akpm/include/linux/mm.h 2004-08-09 22:02:15.768231912 -0700 @@ -590,10 +590,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-09 22:02:15.753234192 -0700 +++ 25-akpm/mm/page_alloc.c 2004-08-09 22:02:15.770231608 -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 _