diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/arch/alpha/mm/numa.c x/arch/alpha/mm/numa.c --- x-ref/arch/alpha/mm/numa.c 2003-06-13 22:07:23.000000000 +0200 +++ x/arch/alpha/mm/numa.c 2003-10-04 01:02:20.000000000 +0200 @@ -311,7 +311,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), NULL, zones_size, start_pfn< max_mapnr) { max_mapnr = lmax_mapnr; @@ -389,7 +389,7 @@ void __init mem_init(void) totalram_pages += free_all_bootmem_node(NODE_DATA(nid)); lmem_map = NODE_MEM_MAP(nid); - pfn = NODE_DATA(nid)->node_start_paddr >> PAGE_SHIFT; + pfn = NODE_DATA(nid)->node_start_pfn; for (i = 0; i < PLAT_NODE_DATA_SIZE(nid); i++, pfn++) if (page_is_ram(pfn) && PageReserved(lmem_map+i)) reservedpages++; diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/arch/arm/mm/init.c x/arch/arm/mm/init.c --- x-ref/arch/arm/mm/init.c 2003-08-26 00:12:43.000000000 +0200 +++ x/arch/arm/mm/init.c 2003-10-04 01:02:20.000000000 +0200 @@ -565,7 +565,7 @@ void __init paging_init(struct meminfo * arch_adjust_zones(node, zone_size, zhole_size); free_area_init_node(node, pgdat, 0, zone_size, - bdata->node_boot_start, zhole_size); + bdata->node_boot_start >> PAGE_SHIFT, zhole_size); } /* diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/arch/cris/mm/init.c x/arch/cris/mm/init.c --- x-ref/arch/cris/mm/init.c 2003-08-26 00:12:43.000000000 +0200 +++ x/arch/cris/mm/init.c 2003-10-04 01:02:20.000000000 +0200 @@ -371,7 +371,7 @@ paging_init(void) * mem_map page array. */ - free_area_init_node(0, 0, 0, zones_size, PAGE_OFFSET, 0); + free_area_init_node(0, 0, 0, zones_size, PAGE_OFFSET >> PAGE_SHIFT, 0); } diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/arch/sh/mm/init.c x/arch/sh/mm/init.c --- x-ref/arch/sh/mm/init.c 2003-08-26 00:12:51.000000000 +0200 +++ x/arch/sh/mm/init.c 2003-10-04 01:02:20.000000000 +0200 @@ -127,11 +127,11 @@ void __init paging_init(void) zones_size[ZONE_DMA] = max_dma - start_pfn; zones_size[ZONE_NORMAL] = low - max_dma; } - free_area_init_node(0, NODE_DATA(0), 0, zones_size, __MEMORY_START, 0); + free_area_init_node(0, NODE_DATA(0), 0, zones_size, __MEMORY_START >> PAGE_SHIFT, 0); #ifdef CONFIG_DISCONTIGMEM zones_size[ZONE_DMA] = __MEMORY_SIZE_2ND >> PAGE_SHIFT; zones_size[ZONE_NORMAL] = 0; - free_area_init_node(1, NODE_DATA(1), 0, zones_size, __MEMORY_START_2ND, 0); + free_area_init_node(1, NODE_DATA(1), 0, zones_size, __MEMORY_START_2ND >> PAGE_SHIFT, 0); #endif } } diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/arch/sparc/mm/srmmu.c x/arch/sparc/mm/srmmu.c --- x-ref/arch/sparc/mm/srmmu.c 2003-10-02 00:09:42.000000000 +0200 +++ x/arch/sparc/mm/srmmu.c 2003-10-04 01:02:20.000000000 +0200 @@ -1249,7 +1249,7 @@ void __init srmmu_paging_init(void) zholes_size[ZONE_HIGHMEM] = npages - calc_highpages(); free_area_init_node(0, NULL, NULL, zones_size, - phys_base, zholes_size); + phys_base >> PAGE_SHIFT, zholes_size); } } diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/arch/sparc/mm/sun4c.c x/arch/sparc/mm/sun4c.c --- x-ref/arch/sparc/mm/sun4c.c 2003-06-13 22:07:24.000000000 +0200 +++ x/arch/sparc/mm/sun4c.c 2003-10-04 01:02:20.000000000 +0200 @@ -2048,7 +2048,7 @@ void __init sun4c_paging_init(void) zholes_size[ZONE_HIGHMEM] = npages - calc_highpages(); free_area_init_node(0, NULL, NULL, zones_size, - phys_base, zholes_size); + phys_base >> PAGE_SHIFT, zholes_size); } cnt = 0; diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/arch/sparc64/mm/init.c x/arch/sparc64/mm/init.c --- x-ref/arch/sparc64/mm/init.c 2003-10-04 01:02:15.000000000 +0200 +++ x/arch/sparc64/mm/init.c 2003-10-04 01:02:20.000000000 +0200 @@ -1459,7 +1459,7 @@ void __init paging_init(void) zholes_size[ZONE_DMA] = npages - pages_avail; free_area_init_node(0, NULL, NULL, zones_size, - phys_base, zholes_size); + phys_base >> PAGE_SHIFT, zholes_size); } device_scan(); diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/include/asm-alpha/mmzone.h x/include/asm-alpha/mmzone.h --- x-ref/include/asm-alpha/mmzone.h 2003-10-04 01:02:15.000000000 +0200 +++ x/include/asm-alpha/mmzone.h 2003-10-04 01:02:20.000000000 +0200 @@ -55,14 +55,14 @@ extern plat_pg_data_t *plat_node_data[]; #if 1 #define PLAT_NODE_DATA_LOCALNR(p, n) \ - (((p) - PLAT_NODE_DATA(n)->gendata.node_start_paddr) >> PAGE_SHIFT) + (((p) >> PAGE_SHIFT) - PLAT_NODE_DATA(n)->gendata.node_start_pfn) #else static inline unsigned long PLAT_NODE_DATA_LOCALNR(unsigned long p, int n) { unsigned long temp; - temp = p - PLAT_NODE_DATA(n)->gendata.node_start_paddr; - return (temp >> PAGE_SHIFT); + temp = p >> PAGE_SHIFT; + return temp - PLAT_NODE_DATA(n)->gendata.node_start_pfn; } #endif @@ -97,7 +97,7 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, * and returns the kaddr corresponding to first physical page in the * node's mem_map. */ -#define LOCAL_BASE_ADDR(kaddr) ((unsigned long)__va(NODE_DATA(KVADDR_TO_NID(kaddr))->node_start_paddr)) +#define LOCAL_BASE_ADDR(kaddr) ((unsigned long)__va(NODE_DATA(KVADDR_TO_NID(kaddr))->node_start_pfn << PAGE_SHIFT)) #define LOCAL_MAP_NR(kvaddr) \ (((unsigned long)(kvaddr)-LOCAL_BASE_ADDR(kvaddr)) >> PAGE_SHIFT) diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/include/asm-alpha/pgtable.h x/include/asm-alpha/pgtable.h --- x-ref/include/asm-alpha/pgtable.h 2003-10-04 01:02:15.000000000 +0200 +++ x/include/asm-alpha/pgtable.h 2003-10-04 01:02:20.000000000 +0200 @@ -193,9 +193,9 @@ extern unsigned long __zero_page(void); #ifndef CONFIG_DISCONTIGMEM #define PAGE_TO_PA(page) ((page - mem_map) << PAGE_SHIFT) #else -#define PAGE_TO_PA(page) \ - ((((page)-page_zone(page)->zone_mem_map) << PAGE_SHIFT) \ - + page_zone(page)->zone_start_paddr) +#define PAGE_TO_PA(page) \ + ((((page)-page_zone(page)->zone_mem_map) + \ + page_zone(page)->zone_start_pfn) << PAGE_SHIFT) #endif #ifndef CONFIG_DISCONTIGMEM @@ -214,7 +214,7 @@ extern unsigned long __zero_page(void); unsigned long pfn; \ \ pfn = ((unsigned long)((page)-page_zone(page)->zone_mem_map)) << 32; \ - pfn += page_zone(page)->zone_start_paddr << (32-PAGE_SHIFT); \ + pfn += page_zone(page)->zone_start_pfn << 32; \ pte_val(pte) = pfn | pgprot_val(pgprot); \ \ pte; \ @@ -237,7 +237,7 @@ extern unsigned long __zero_page(void); unsigned long pfn; \ \ pfn = ((unsigned long)((page)-page_zone(page)->zone_mem_map)) << 32; \ - pfn += page_zone(page)->zone_start_paddr << (32-PAGE_SHIFT); \ + pfn += page_zone(page)->zone_start_pfn << 32; \ pmd_val(pmd) = pfn | pgprot_val(pgprot); \ \ pmd; \ diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/include/linux/blkdev.h x/include/linux/blkdev.h --- x-ref/include/linux/blkdev.h 2003-10-04 01:02:15.000000000 +0200 +++ x/include/linux/blkdev.h 2003-10-04 01:02:20.000000000 +0200 @@ -191,7 +191,7 @@ extern inline struct buffer_head *blk_qu #ifndef CONFIG_DISCONTIGMEM if (page - mem_map <= q->bounce_pfn) #else - if ((page - page_zone(page)->zone_mem_map) + (page_zone(page)->zone_start_paddr >> PAGE_SHIFT) <= q->bounce_pfn) + if ((page - page_zone(page)->zone_mem_map) + page_zone(page)->zone_start_pfn <= q->bounce_pfn) #endif return bh; diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/include/linux/mm.h x/include/linux/mm.h --- x-ref/include/linux/mm.h 2003-10-04 01:02:18.000000000 +0200 +++ x/include/linux/mm.h 2003-10-04 01:02:26.000000000 +0200 @@ -367,9 +367,9 @@ static inline void set_page_zone(struct #define set_page_address(page, address) do { } while(0) #ifdef CONFIG_DISCONTIGMEM -#define page_address(page) \ - __va( (((page) - page_zone(page)->zone_mem_map) << PAGE_SHIFT) \ - + page_zone(page)->zone_start_paddr) +#define page_address(page) \ + __va( (((page) - page_zone(page)->zone_mem_map) + \ + page_zone(page)->zone_start_pfn) << PAGE_SHIFT) #else #define page_address(page) __va(((page) - mem_map) << PAGE_SHIFT) #endif @@ -533,7 +533,7 @@ extern int check_pgt_cache(void); extern void free_area_init(unsigned long * zones_size); extern void free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap, - unsigned long * zones_size, unsigned long zone_start_paddr, + unsigned long * zones_size, unsigned long zone_start_pfn, unsigned long *zholes_size); extern void mem_init(void); extern void show_mem(void); diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/include/linux/mmzone.h x/include/linux/mmzone.h --- x-ref/include/linux/mmzone.h 2003-10-04 01:02:15.000000000 +0200 +++ x/include/linux/mmzone.h 2003-10-04 01:02:20.000000000 +0200 @@ -92,7 +92,8 @@ typedef struct zone_struct { */ struct pglist_data *zone_pgdat; struct page *zone_mem_map; - unsigned long zone_start_paddr; + /* zone_start_pfn == zone_start_paddr >> PAGE_SHIFT */ + unsigned long zone_start_pfn; unsigned long zone_start_mapnr; /* @@ -171,7 +172,7 @@ typedef struct pglist_data { struct page *node_mem_map; unsigned long *valid_addr_bitmap; struct bootmem_data *bdata; - unsigned long node_start_paddr; + unsigned long node_start_pfn; unsigned long node_start_mapnr; unsigned long node_size; int node_id; diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/mm/numa.c x/mm/numa.c --- x-ref/mm/numa.c 2003-10-04 01:02:15.000000000 +0200 +++ x/mm/numa.c 2003-10-04 01:02:20.000000000 +0200 @@ -22,11 +22,11 @@ pg_data_t contig_page_data = { bdata: &c * Should be invoked with paramters (0, 0, unsigned long *[], start_paddr). */ void __init free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap, - unsigned long *zones_size, unsigned long zone_start_paddr, + unsigned long *zones_size, unsigned long zone_start_pfn, unsigned long *zholes_size) { free_area_init_core(0, &contig_page_data, &mem_map, zones_size, - zone_start_paddr, zholes_size, pmap); + zone_start_pfn, zholes_size, pmap); } #endif /* !CONFIG_DISCONTIGMEM */ @@ -59,7 +59,7 @@ void show_free_areas_node(pg_data_t *pgd * Nodes can be initialized parallely, in no particular order. */ void __init free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap, - unsigned long *zones_size, unsigned long zone_start_paddr, + unsigned long *zones_size, unsigned long zone_start_pfn, unsigned long *zholes_size) { int i, size = 0; @@ -68,7 +68,7 @@ void __init free_area_init_node(int nid, if (mem_map == (mem_map_t *)NULL) mem_map = (mem_map_t *)PAGE_OFFSET; - free_area_init_core(nid, pgdat, &discard, zones_size, zone_start_paddr, + free_area_init_core(nid, pgdat, &discard, zones_size, zone_start_pfn, zholes_size, pmap); pgdat->node_id = nid; diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids x-ref/mm/page_alloc.c x/mm/page_alloc.c --- x-ref/mm/page_alloc.c 2003-10-04 01:02:19.000000000 +0200 +++ x/mm/page_alloc.c 2003-10-04 01:02:20.000000000 +0200 @@ -855,7 +855,7 @@ static inline void wait_table_init(pg_da * - clear the memory bitmaps */ void __init free_area_init_core(int nid, pg_data_t *pgdat, struct page **gmap, - unsigned long *zones_size, unsigned long zone_start_paddr, + unsigned long *zones_size, unsigned long zone_start_pfn, unsigned long *zholes_size, struct page *lmem_map) { unsigned long i, j; @@ -863,9 +863,6 @@ void __init free_area_init_core(int nid, unsigned long totalpages, offset, realtotalpages; const unsigned long zone_required_alignment = 1UL << (MAX_ORDER-1); - if (zone_start_paddr & ~PAGE_MASK) - BUG(); - totalpages = 0; for (i = 0; i < MAX_NR_ZONES; i++) { unsigned long size = zones_size[i]; @@ -893,7 +890,7 @@ void __init free_area_init_core(int nid, } *gmap = pgdat->node_mem_map = lmem_map; pgdat->node_size = totalpages; - pgdat->node_start_paddr = zone_start_paddr; + pgdat->node_start_pfn = zone_start_pfn; pgdat->node_start_mapnr = (lmem_map - mem_map); pgdat->nr_zones = 0; @@ -971,9 +968,9 @@ void __init free_area_init_core(int nid, zone->zone_mem_map = mem_map + offset; zone->zone_start_mapnr = offset; - zone->zone_start_paddr = zone_start_paddr; + zone->zone_start_pfn = zone_start_pfn; - if ((zone_start_paddr >> PAGE_SHIFT) & (zone_required_alignment-1)) + if ((zone_start_pfn) & (zone_required_alignment-1)) printk("BUG: wrong zone alignment, it will crash\n"); /* @@ -988,8 +985,12 @@ void __init free_area_init_core(int nid, SetPageReserved(page); INIT_LIST_HEAD(&page->list); if (j != ZONE_HIGHMEM) - set_page_address(page, __va(zone_start_paddr)); - zone_start_paddr += PAGE_SIZE; + /* + * The shift left won't overflow because the + * ZONE_NORMAL is below 4G. + */ + set_page_address(page, __va(zone_start_pfn << PAGE_SHIFT)); + zone_start_pfn++; } offset += size;