From mboxrd@z Thu Jan 1 00:00:00 1970 Subject: 080 alloc_remap i386 In-Reply-To: <4173D219.3010706@shadowen.org> Message-Id: From: Andy Whitcroft Date: Mon, 18 Oct 2004 15:34:30 +0100 Sender: owner-linux-mm@kvack.org Return-Path: To: apw@shadowen.org, lhms-devel@lists.sourceforge.net, linux-mm@kvack.org List-ID: Introduce a new allocator for the NUMA the scares remap space. Revision: $Rev$ Signed-off-by: Andy Whitcroft diffstat 080-alloc_remap-i386 --- arch/i386/mm/discontig.c | 55 ++++++++++++++++++++++++++++++++++++++++------ include/asm-i386/mmzone.h | 2 + mm/page_alloc.c | 35 ++++++++++++++++++++++++++--- 3 files changed, 83 insertions(+), 9 deletions(-) diff -X /home/apw/brief/lib/vdiff.excl -rupN reference/arch/i386/mm/discontig.c current/arch/i386/mm/discontig.c --- reference/arch/i386/mm/discontig.c +++ current/arch/i386/mm/discontig.c @@ -81,6 +81,9 @@ unsigned long node_remap_offset[MAX_NUMN void *node_remap_start_vaddr[MAX_NUMNODES]; void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags); +void *node_remap_end_vaddr[MAX_NUMNODES]; +void *node_remap_alloc_vaddr[MAX_NUMNODES]; + /* * FLAT - support for basic PC memory model with discontig enabled, essentially * a single node with all available processors in it with a flat @@ -136,13 +139,36 @@ static void __init allocate_pgdat(int ni } } +void *alloc_remap(int nid, unsigned long size) +{ + void *allocation = node_remap_alloc_vaddr[nid]; + + printk(KERN_WARNING "APW: alloc_remap(%d, %08lx)\n", nid, size); + + size = ALIGN(size, L1_CACHE_BYTES); + + if (!allocation) + return 0; + if ((allocation + size) >= node_remap_end_vaddr[nid]) + return 0; + + node_remap_alloc_vaddr[nid] += size; + + memset(allocation, 0, size); + + printk(KERN_WARNING "APW: alloc_remap(%d, %08lx) = %p\n", nid, size, + allocation); + + return allocation; +} + void __init remap_numa_kva(void) { void *vaddr; unsigned long pfn; int node; - for (node = 1; node < numnodes; ++node) { + for (node = 0; node < numnodes; ++node) { for (pfn=0; pfn < node_remap_size[node]; pfn += PTRS_PER_PTE) { vaddr = node_remap_start_vaddr[node]+(pfn< #endif + #define HAVE_ARCH_ALLOC_REMAP 1 + #else /* !CONFIG_NUMA */ #define get_memcfg_numa get_memcfg_numa_flat #define get_zholes_size(n) (0) diff -X /home/apw/brief/lib/vdiff.excl -rupN reference/mm/page_alloc.c current/mm/page_alloc.c --- reference/mm/page_alloc.c +++ current/mm/page_alloc.c @@ -94,6 +94,9 @@ static void bad_page(const char *functio page->mapping = NULL; } +/* APW/XXX: not here. */ +void *alloc_remap(int nid, unsigned long size); + #ifndef CONFIG_HUGETLB_PAGE #define prep_compound_page(page, order) do { } while (0) #define destroy_compound_page(page, order) do { } while (0) @@ -1442,11 +1445,23 @@ unsigned long pages_to_bitmap_size(unsig return bitmap_size; } +unsigned long zone_bitmap_calculate(unsigned long nr_pages) +{ + unsigned long overall_size = 0; + int order; + + for (order = 0; order < MAX_ORDER - 1; order++) + overall_size += pages_to_bitmap_size(order, nr_pages); + + return overall_size; +} + void zone_init_free_lists(struct pglist_data *pgdat, struct zone *zone, unsigned long size) { int order; for (order = 0; ; order++) { unsigned long bitmap_size; + unsigned long *map; INIT_LIST_HEAD(&zone->free_area[order].free_list); if (order == MAX_ORDER-1) { @@ -1455,8 +1470,15 @@ void zone_init_free_lists(struct pglist_ } bitmap_size = pages_to_bitmap_size(order, size); - zone->free_area[order].map = - (unsigned long *) alloc_bootmem_node(pgdat, bitmap_size); + +#ifdef HAVE_ARCH_ALLOC_REMAP + map = (unsigned long *) alloc_remap(pgdat->node_id, + bitmap_size); + if (!map) +#endif + map = (unsigned long *) alloc_bootmem_node(pgdat, + bitmap_size); + zone->free_area[order].map = map; } } @@ -1581,9 +1603,16 @@ static void __init free_area_init_core(s void __init node_alloc_mem_map(struct pglist_data *pgdat) { unsigned long size; + void *map; size = (pgdat->node_spanned_pages + 1) * sizeof(struct page); - pgdat->node_mem_map = alloc_bootmem_node(pgdat, size); + +#ifdef HAVE_ARCH_ALLOC_REMAP + map = (unsigned long *) alloc_remap(pgdat->node_id, size); + if (!map) +#endif + map = alloc_bootmem_node(pgdat, size); + pgdat->node_mem_map = map; #ifndef CONFIG_DISCONTIGMEM mem_map = contig_page_data.node_mem_map; #endif -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: aart@kvack.org