X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_mem.c;h=238fdc578a8457e7616abae482a03b12a6b5c21b;hb=564dade4aee58eb392b960dd33823b5e030869ac;hp=c975b84b10e4f2effaf1d186304e09ea4ea3bd8b;hpb=5ef0e92d52b2698fd2706cd7cfc2b01526a6e319;p=palacios.git diff --git a/palacios/src/palacios/vmm_mem.c b/palacios/src/palacios/vmm_mem.c index c975b84..238fdc5 100644 --- a/palacios/src/palacios/vmm_mem.c +++ b/palacios/src/palacios/vmm_mem.c @@ -161,11 +161,13 @@ static int will_use_shadow_paging(struct v3_vm_info *vm) #define CEIL_DIV(x,y) (((x)/(y)) + !!((x)%(y))) + int v3_init_mem_map(struct v3_vm_info * vm) { struct v3_mem_map * map = &(vm->mem_map); addr_t block_pages = v3_mem_block_size >> 12; int i = 0; uint64_t num_base_regions_host_mem; + map->num_base_regions = CEIL_DIV(vm->mem_size, v3_mem_block_size); num_base_regions_host_mem=map->num_base_regions; // without swapping @@ -182,9 +184,8 @@ int v3_init_mem_map(struct v3_vm_info * vm) { PrintDebug(VM_NONE, VCORE_NONE, "v3_init_mem_map: %llu base regions will be allocated of %llu base regions in guest\n", (uint64_t)num_base_regions_host_mem, (uint64_t)map->num_base_regions); - - map->base_regions = V3_Malloc(sizeof(struct v3_mem_region) * map->num_base_regions); - + + map->base_regions = V3_VMalloc(sizeof(struct v3_mem_region) * map->num_base_regions); if (map->base_regions == NULL) { PrintError(vm, VCORE_NONE, "Could not allocate base region array\n"); return -1; @@ -216,11 +217,12 @@ int v3_init_mem_map(struct v3_vm_info * vm) { #ifdef V3_CONFIG_SWAPPING // nothing to do - memset will have done it. #endif - + region->host_addr = (addr_t)V3_AllocPagesExtended(block_pages, PAGE_SIZE_4KB, node_id, - 0); // no constraints + vm->resource_control.pg_filter_func, + vm->resource_control.pg_filter_state); if ((void *)region->host_addr == NULL) { PrintError(vm, VCORE_NONE, "Could not allocate guest memory\n"); @@ -295,8 +297,7 @@ void v3_delete_mem_map(struct v3_vm_info * vm) { #endif } - V3_Free(map->base_regions); - + V3_VFree(map->base_regions); } @@ -523,7 +524,7 @@ static struct v3_mem_region * get_next_mem_region( struct v3_vm_info * vm, uint1 } - if (parent->guest_start > guest_addr) { + if (!parent || parent->guest_start > guest_addr) { return parent; } else if (parent->guest_end < guest_addr) { struct rb_node * node = &(parent->tree_node);