Giving free_area_init_* a rototilling
Subsystems (6)
Below is a half-finished patch .... trying to clean up the gross mess in free_area_init for discongtimem, and get rid of all the hack "mem_map = PAGE_OFFSET" and add map_nr's from there stuff. It probably doesn't even compile, but I'd be interested in any feedback on the approach. It also depends on another patch to convert the paddrs to pfns, which I can send if you want, but I think the attatched should be readable?
arch/alpha/mm/numa.c +3 -1
@@ -295,7 +295,9 @@ zones_size[ZONE_NORMAL ] = (end_pfn - start_pfn) - dma_local_pfn; }free_area_init_node (nid,NODE_DATA (nid),NULL , zones_size, start_pfn,NULL ); - lmax_mapnr =PLAT_NODE_DATA_STARTNR (nid) +PLAT_NODE_DATA_SIZE (nid); +/* THIS IS EVIL. Stop using mapnr for discontigmem */ + lmax_mapnr =PLAT_NODE_DATA (n)->node_mem_map - mem_map + +PLAT_NODE_DATA_SIZE (nid);if (lmax_mapnr > max_mapnr) { max_mapnr = lmax_mapnr;DBGDCONT ("Grow max_mapnr to %ld\n" , max_mapnr);
arch/mips64/sgi-ip27/ip27-memory.c +9 -9
@@ -234,6 +234,7 @@cnodeid_t node;unsigned long zones_size[MAX_NR_ZONES ] = {0 ,0 ,0 };int i; +unsigned long lmax_mapnr;/* Initialize the entire pgd. */ pgd_init ((unsigned long )swapper_pg_dir);
@@ -254,10 +255,11 @@ zones_size[ZONE_DMA ] = end_pfn +1 - start_pfn;free_area_init_node (node,NODE_DATA (node),0 , zones_size, start_pfn,0 ); -if ((PLAT_NODE_DATA_STARTNR (node) + -PLAT_NODE_DATA_SIZE (node)) > pagenr) - pagenr =PLAT_NODE_DATA_STARTNR (node) + -PLAT_NODE_DATA_SIZE (node); +/* THIS IS EVIL. Stop using mapnr for discontigmem */ + lmax_mapnr =PLAT_NODE_DATA (n)->node_mem_map - mem_map + +PLAT_NODE_DATA_SIZE (node); +if (lmax_mapnr > pagenr) + pagenr = lmax_mapnr; } }
@@ -271,7 +273,6 @@unsigned long codesize, datasize, initsize;int slot, numslots;struct page *pg, *pslot; -pfn_t pgnr; num_physpages = numpages;/* memory already sized by szmem */ max_mapnr = pagenr;/* already found during paging_init */
@@ -293,7 +294,6 @@* We need to manually do the other slots. */ pg =NODE_DATA (nid)->node_mem_map +slot_getsize (nid,0 ); - pgnr =PLAT_NODE_DATA_STARTNR (nid) +slot_getsize (nid,0 ); numslots =node_getlastslot (nid);for (slot =1 ; slot <= numslots; slot++) { pslot = NODE_DATA(nid)->node_mem_map +
@@ -304,7 +304,7 @@* free up the pages that hold the memmap entries. */ while (pg < pslot) { - pg++; pgnr++; + pg++; }/*
@@ -312,8 +312,8 @@*/ pslot +=slot_getsize (nid, slot);while (pg < pslot) { -if (!page_is_ram (pgnr)) -continue ; +/* if (!page_is_ram(pgnr)) continue; */ +/* commented out until page_is_ram works */ ClearPageReserved (pg);atomic_set (&pg->count,1 );__free_page (pg);
include/asm-alpha/mmzone.h +0 -2
@@ -46,8 +46,6 @@#define PHYSADDR_TO_NID (pa) ALPHA_PA_TO_NID(pa)#define PLAT_NODE_DATA (n) (plat_node_data[(n)]) -#define PLAT_NODE_DATA_STARTNR (n) \ - (PLAT_NODE_DATA(n)->gendata.node_start_mapnr)#define PLAT_NODE_DATA_SIZE (n) (PLAT_NODE_DATA(n)->gendata.node_size)#if 1
include/asm-i386/mmzone.h +0 -2
@@ -49,8 +49,6 @@ __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0)#define PLAT_NODE_DATA (n) (plat_node_data[(n)]) -#define PLAT_NODE_DATA_STARTNR (n) \ - (PLAT_NODE_DATA(n)->gendata.node_start_mapnr)#define PLAT_NODE_DATA_SIZE (n) (PLAT_NODE_DATA(n)->gendata.node_size)#define PLAT_NODE_DATA_LOCALNR (pfn, n) \ ((pfn) - PLAT_NODE_DATA(n)->gendata.node_start_pfn)
include/asm-mips64/mmzone.h +0 -1
@@ -24,7 +24,6 @@#define PHYSADDR_TO_NID (pa) NASID_TO_COMPACT_NODEID(NASID_GET(pa))#define PLAT_NODE_DATA (n) (plat_node_data[n]) -#define PLAT_NODE_DATA_STARTNR (n) (PLAT_NODE_DATA(n)->gendata.node_start_mapnr)#define PLAT_NODE_DATA_SIZE (n) (PLAT_NODE_DATA(n)->gendata.node_size)#define PLAT_NODE_DATA_LOCALNR (p, n) \ (((p) >> PAGE_SHIFT) - PLAT_NODE_DATA(n)->gendata.node_start_pfn)
include/asm-mips64/pgtable.h +4 -4
@@ -373,10 +373,10 @@#ifndef CONFIG_DISCONTIGMEM #define pte_page (x) (mem_map+(unsigned long)((pte_val(x) >> PAGE_SHIFT)))#else -#define mips64_pte_pagenr (x) \ - (PLAT_NODE_DATA_STARTNR(PHYSADDR_TO_NID(pte_val(x))) + \ - PLAT_NODE_DATA_LOCALNR(pte_val(x), PHYSADDR_TO_NID(pte_val(x)))) -#define pte_page (x) (mem_map+mips64_pte_pagenr(x)) + +#define pte_page (x) ( NODE_MEM_MAP(PHYSADDR_TO_NID(pte_val(x))) + + PLAT_NODE_DATA_LOCALNR(pte_val(x), PHYSADDR_TO_NID(pte_val(x))) ) +#endif /*
include/asm-ppc64/mmzone.h +0 -2
@@ -24,8 +24,6 @@/* XXX grab this from the device tree - Anton */ #define PHYSADDR_TO_NID (pa) ((pa) >> 36)#define PLAT_NODE_DATA (n) (&plat_node_data[(n)]) -#define PLAT_NODE_DATA_STARTNR (n) \ - (PLAT_NODE_DATA(n)->gendata.node_start_mapnr)#define PLAT_NODE_DATA_SIZE (n) (PLAT_NODE_DATA(n)->gendata.node_size)#define PLAT_NODE_DATA_LOCALNR (p, n) \ (((p) >> PAGE_SHIFT) - PLAT_NODE_DATA(n)->gendata.node_start_pfn)
include/linux/mmzone.h +3 -3
@@ -83,7 +83,6 @@struct page *zone_mem_map;/* zone_start_pfn == zone_start_paddr >> PAGE_SHIFT */ unsigned long zone_start_pfn; -unsigned long zone_start_mapnr;/* * rarely used fields:
@@ -134,7 +133,6 @@unsigned long *valid_addr_bitmap;struct bootmem_data *bdata;unsigned long node_start_pfn; -unsigned long node_start_mapnr;unsigned long node_size;int node_id;struct pglist_data *pgdat_next;
@@ -158,7 +156,9 @@*/ struct page ;extern void show_free_areas_core (pg_data_t *pgdat); -extern void free_area_init_core (int nid,pg_data_t *pgdat,struct page **gmap, +extern void calculate_totalpages (pg_data_t *pgdat,unsigned long *zones_size, +unsigned long *zholes_size); +extern void free_area_init_core (int nid,pg_data_t *pgdat,unsigned long *zones_size,unsigned long paddr,unsigned long *zholes_size,struct page *pmap);
mm/numa.c +25 -11
@@ -22,11 +22,21 @@* 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_pfn, +unsigned long *zones_size,unsigned long node_start_pfn,unsigned long *zholes_size) { -free_area_init_core (0 , &contig_page_data, &mem_map, zones_size, - zone_start_pfn, zholes_size, pmap); +unsigned long size; + + contig_page_data->node_mem_map = pmap; + contig_page_data->node_id =0 ; + contig_page_data->node_start_pfn = node_start_pfn; +calculate_totalpages (&contig_page_data, zones_size, zholes_size); +if (pmap == (struct page *)0 ) { + size = (pgdat->node_size +1 ) *sizeof (struct page ); + pmap = (struct page *)alloc_bootmem_node (pgdat, size); + } +free_area_init_core (&contig_page_data, zones_size, zholes_size); + mem_map = contig_page_data->node_mem_map; }#endif /* !CONFIG_DISCONTIGMEM */
@@ -48,22 +58,26 @@* 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_pfn, +unsigned long *zones_size,unsigned long node_start_pfn,unsigned long *zholes_size) { -int i, size =0 ; -struct page *discard; - -if (mem_map ==NULL ) - mem_map = (struct page *)PAGE_OFFSET ; +int i; +unsigned long size; -free_area_init_core (nid, pgdat, &discard, zones_size, zone_start_pfn, - zholes_size, pmap); pgdat->node_id = nid; + pgdat->node_mem_map = pmap; + pgdat->node_start_pfn = node_start_pfn; +calculate_totalpages (pgdat, zones_size, zholes_size); +if (pmap == (struct page *)0 ) { + size = (pgdat->node_size +1 ) *sizeof (struct page ); + pmap = (struct page *)alloc_bootmem_node (pgdat, size); + } +free_area_init_core (pgdat, zones_size, zone_start_pfn);/* * Get space for the valid bitmap. */ + size =0 ;for (i =0 ; i <MAX_NR_ZONES ; i++) size += zones_size[i]; size =LONG_ALIGN ((size +7 ) >>3 );
mm/page_alloc.c +34 -44
125 lines not on this page · raw message
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/