X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fmm.c;h=1b70b74639ef2d267176b130b2312f6aaa2878e3;hb=ec9f38e306b02bb98029fb950bcb4d0bd0c3aed2;hp=c5ec916c3cbe47929d0db6cc931ddd8dc4ae2168;hpb=28dcbfda8061d2785301784d27694d1e02f54fff;p=palacios.git diff --git a/linux_module/mm.c b/linux_module/mm.c index c5ec916..1b70b74 100644 --- a/linux_module/mm.c +++ b/linux_module/mm.c @@ -76,7 +76,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_idtype,r->node,r->base_addr,r->num_pages); // fixup request regardless of its type - if (r->num_pages*4096 < V3_CONFIG_MEM_BLOCK_SIZE) { + if (r->num_pages*4096 < get_palacios_mem_block_size()) { WARNING("Allocating a memory pool smaller than the Palacios block size - may not be useful\n"); } @@ -130,7 +160,7 @@ int add_palacios_memory(struct v3_mem_region *r) { ERROR("Unable to satisfy allocation request\n"); palacios_free(keep); return -1; - } + } r->base_addr = page_to_pfn(pgs) << PAGE_SHIFT; } @@ -270,11 +300,13 @@ 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); @@ -288,12 +320,25 @@ int palacios_init_mm( void ) { 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; } + // Initialization is done using the compile-time memory block size since + // at this point, we do not yet know what the run-time size is zone = buddy_init(get_order(V3_CONFIG_MEM_BLOCK_SIZE) + PAGE_SHIFT, PAGE_SHIFT, node_id); if (zone == NULL) {