From: Jack Lange Date: Fri, 19 Nov 2010 03:44:07 +0000 (-0600) Subject: update page free interface to allow freeing of multiple pages (needed for linux) X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=ea942030159fbf603538bfd9cf4d5c5f29804131;hp=1df601c90b519a54b64ca101fd6aa4c0a39bf0f0;p=palacios.git update page free interface to allow freeing of multiple pages (needed for linux) --- diff --git a/palacios/include/palacios/vmm.h b/palacios/include/palacios/vmm.h index 8742ff6..a0827fd 100644 --- a/palacios/include/palacios/vmm.h +++ b/palacios/include/palacios/vmm.h @@ -90,11 +90,11 @@ struct guest_info; }) -#define V3_FreePage(page) \ +#define V3_FreePages(page, num_pages) \ do { \ extern struct v3_os_hooks * os_hooks; \ - if ((os_hooks) && (os_hooks)->free_page) { \ - (os_hooks)->free_page(page); \ + if ((os_hooks) && (os_hooks)->free_pages) { \ + (os_hooks)->free_pages(page, num_pages); \ } \ } while(0) @@ -270,14 +270,14 @@ struct v3_os_hooks { void (*print)(const char * format, ...) __attribute__ ((format (printf, 1, 2))); - void *(*allocate_pages)(int numPages, unsigned int alignment); - void (*free_page)(void * page); + void *(*allocate_pages)(int num_pages, unsigned int alignment); + void (*free_pages)(void * page, int num_pages); void *(*malloc)(unsigned int size); void (*free)(void * addr); - void *(*paddr_to_vaddr)(void *addr); - void *(*vaddr_to_paddr)(void *addr); + void *(*paddr_to_vaddr)(void * addr); + void *(*vaddr_to_paddr)(void * addr); int (*hook_interrupt)(struct v3_vm_info * vm, unsigned int irq); int (*ack_irq)(int irq); diff --git a/palacios/src/palacios/mmu/vmm_shdw_pg_kvm.c b/palacios/src/palacios/mmu/vmm_shdw_pg_kvm.c index decf6b9..250cbba 100644 --- a/palacios/src/palacios/mmu/vmm_shdw_pg_kvm.c +++ b/palacios/src/palacios/mmu/vmm_shdw_pg_kvm.c @@ -116,7 +116,7 @@ static void shadow_free_page (struct guest_info * core, struct shadow_page_cache { list_del(&page->link); - V3_FreePage((void *)page->page_pa); + V3_FreePages((void *)page->page_pa, 1); page->page_pa=(addr_t)V3_AllocPages(1); list_add(&page->link,&core->free_pages); @@ -163,7 +163,7 @@ static void free_shadow_pages(struct guest_info * core) while (!list_empty(&core->free_pages)) { page = list_entry(core->free_pages.next, struct shadow_page_cache_data, link); list_del(&page->link); - V3_FreePage((void *)page->page_pa); + V3_FreePages((void *)page->page_pa, 1); page->page_pa = ~(addr_t)0; //invalid address } } diff --git a/palacios/src/palacios/vmm_mem.c b/palacios/src/palacios/vmm_mem.c index a1505c3..56dcbbb 100644 --- a/palacios/src/palacios/vmm_mem.c +++ b/palacios/src/palacios/vmm_mem.c @@ -96,6 +96,7 @@ void v3_delete_mem_map(struct v3_vm_info * vm) { struct rb_node * node = v3_rb_first(&(vm->mem_map.mem_regions)); struct v3_mem_region * reg; struct rb_node * tmp_node = NULL; + addr_t mem_pages = vm->mem_size >> 12; while (node) { reg = rb_entry(node, struct v3_mem_region, tree_node); @@ -105,7 +106,7 @@ void v3_delete_mem_map(struct v3_vm_info * vm) { v3_delete_mem_region(vm, reg); } - V3_FreePage((void *)(vm->mem_map.base_region.host_addr)); + V3_FreePages((void *)(vm->mem_map.base_region.host_addr), mem_pages); } diff --git a/palacios/src/palacios/vmm_paging.c b/palacios/src/palacios/vmm_paging.c index 1030fe2..05d1025 100644 --- a/palacios/src/palacios/vmm_paging.c +++ b/palacios/src/palacios/vmm_paging.c @@ -67,11 +67,11 @@ void delete_page_tables_32(pde32_t * pde) { // We double cast, first to an addr_t to handle 64 bit issues, then to the pointer PrintDebug("Deleting PT Page %d (%p)\n", i, (void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[i].pt_base_addr)); - V3_FreePage((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[i].pt_base_addr)); + V3_FreePages((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[i].pt_base_addr), 1); } } - V3_FreePage(V3_PAddr(pde)); + V3_FreePages(V3_PAddr(pde), 1); } void delete_page_tables_32pae(pdpe32pae_t * pdpe) { @@ -96,13 +96,13 @@ void delete_page_tables_32pae(pdpe32pae_t * pdpe) { continue; } - V3_FreePage((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[j].pt_base_addr)); + V3_FreePages((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[j].pt_base_addr), 1); } - V3_FreePage(V3_PAddr(pde)); + V3_FreePages(V3_PAddr(pde), 1); } - V3_FreePage(V3_PAddr(pdpe)); + V3_FreePages(V3_PAddr(pdpe), 1); } void delete_page_tables_64(pml4e64_t * pml4) { @@ -133,16 +133,16 @@ void delete_page_tables_64(pml4e64_t * pml4) { continue; } - V3_FreePage((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[k].pt_base_addr)); + V3_FreePages((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[k].pt_base_addr), 1); } - V3_FreePage(V3_PAddr(pde)); + V3_FreePages(V3_PAddr(pde), 1); } - V3_FreePage(V3_PAddr(pdpe)); + V3_FreePages(V3_PAddr(pdpe), 1); } - V3_FreePage(V3_PAddr(pml4)); + V3_FreePages(V3_PAddr(pml4), 1); }