X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fmm.c;h=e4c374a9a4030a49d190d37b8ce3d8134944f44b;hb=da0b4bb80de755529f47b9ca57ccb0c2cefae15b;hp=f394e6da7631e1b1c7daf92d808b526de554c0e3;hpb=4527bc96ddd2dc67994a9c61e101b08d4850b094;p=palacios.git diff --git a/linux_module/mm.c b/linux_module/mm.c index f394e6d..e4c374a 100644 --- a/linux_module/mm.c +++ b/linux_module/mm.c @@ -21,20 +21,9 @@ static uintptr_t * seed_addrs = NULL; // alignment is in bytes -uintptr_t alloc_palacios_pgs(u64 num_pages, u32 alignment, int node_id, int constraints) { +uintptr_t alloc_palacios_pgs(u64 num_pages, u32 alignment, int node_id, int (*filter_func)(void *paddr, void *filter_state), void *filter_state) { uintptr_t addr = 0; int any = node_id==-1; // can allocate on any - int buddy_constraints=0; - - if (constraints && constraints!=V3_ALLOC_PAGES_CONSTRAINT_4GB) { - ERROR("Unknown constraint mask 0x%x\n",constraints); - return 0; - } - - if (constraints & V3_ALLOC_PAGES_CONSTRAINT_4GB) { - buddy_constraints |= LWK_BUDDY_CONSTRAINT_4GB; - } - if (node_id == -1) { int cpu_id = get_cpu(); @@ -50,14 +39,14 @@ uintptr_t alloc_palacios_pgs(u64 num_pages, u32 alignment, int node_id, int cons return 0; } - addr = buddy_alloc(memzones[node_id], get_order(num_pages * PAGE_SIZE) + PAGE_SHIFT, buddy_constraints); + addr = buddy_alloc(memzones[node_id], get_order(num_pages * PAGE_SIZE) + PAGE_SHIFT, filter_func, filter_state); if (!addr && any) { int i; // do a scan to see if we can satisfy request on any node for (i=0; i< numa_num_nodes(); i++) { if (i!=node_id) { - addr = buddy_alloc(memzones[i], get_order(num_pages * PAGE_SIZE) + PAGE_SHIFT, buddy_constraints); + addr = buddy_alloc(memzones[i], get_order(num_pages * PAGE_SIZE) + PAGE_SHIFT, filter_func, filter_state); if (addr) { break; } @@ -76,7 +65,19 @@ void free_palacios_pgs(uintptr_t pg_addr, u64 num_pages) { int node_id = numa_addr_to_node(pg_addr); //DEBUG("Freeing Memory page %p\n", (void *)pg_addr); - buddy_free(memzones[node_id], pg_addr, get_order(num_pages * PAGE_SIZE) + PAGE_SHIFT); + if (buddy_free(memzones[node_id], pg_addr, get_order(num_pages * PAGE_SIZE) + PAGE_SHIFT)) { + // it is possible that the allocation was actually on a different zone, + // so, just to be sure, we'll try to dellocate on each + for (node_id=0;node_idbase_addr = page_to_pfn(pgs) << PAGE_SHIFT; } @@ -288,25 +289,38 @@ int palacios_init_mm( void ) { { struct page * pgs; - + int actual_node; + // attempt to first allocate below 4 GB for compatibility with // 32 bit shadow paging pgs = alloc_pages_node(node_id, GFP_DMA32, MAX_ORDER - 1); + if (!pgs) { INFO("Could not allocate initial memory block for node %d below 4GB\n", node_id); pgs = alloc_pages_node(node_id, GFP_KERNEL, MAX_ORDER - 1); if (!pgs) { - INFO("Could not allocate initial memory block for node %d beloew 4GB\n", node_id); + INFO("Could not allocate initial memory block for node %d below 4GB\n", node_id); if (!pgs) { ERROR("Could not allocate initial memory block for node %d without restrictions\n", node_id); BUG_ON(!pgs); palacios_deinit_mm(); return -1; } + } else { + actual_node=numa_addr_to_node((uintptr_t)(page_to_pfn(pgs) << PAGE_SHIFT)); + if (actual_node != node_id) { + WARNING("Initial 64 bit allocation attempt for node %d resulted in allocation on node %d\n",node_id,actual_node); + } } + + } else { + actual_node=numa_addr_to_node((uintptr_t)(page_to_pfn(pgs) << PAGE_SHIFT)); + if (actual_node != node_id) { + WARNING("Initial 32bit-limited allocation attempt for node %d resulted in allocation on node %d\n",node_id,actual_node); + } } seed_addrs[node_id] = page_to_pfn(pgs) << PAGE_SHIFT;