X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_checkpoint.c;h=92c5e166b403d4b6fb1630facba6ca5baa99ebc7;hb=e3ae29e38a73107f381dbef746c8319eb2c8012b;hp=a4c593acb4260cd96f8c47710f439e6321fb8066;hpb=cccc6b1a738266ed3d3bd2011b573e7033c012a8;p=palacios.releases.git diff --git a/palacios/src/palacios/vmm_checkpoint.c b/palacios/src/palacios/vmm_checkpoint.c index a4c593a..92c5e16 100644 --- a/palacios/src/palacios/vmm_checkpoint.c +++ b/palacios/src/palacios/vmm_checkpoint.c @@ -315,8 +315,11 @@ static int load_memory(struct v3_vm_info * vm, struct v3_chkpt * chkpt) { void * guest_mem_base = NULL; void * ctx = NULL; uint64_t ret = 0; - - guest_mem_base = V3_VAddr((void *)vm->mem_map.base_region.host_addr); + uint64_t saved_mem_block_size; + uint32_t saved_num_base_regions; + char buf[128]; + int i; + extern uint64_t v3_mem_block_size; ctx = v3_chkpt_open_ctx(chkpt, "memory_img"); @@ -325,10 +328,34 @@ static int load_memory(struct v3_vm_info * vm, struct v3_chkpt * chkpt) { return -1; } - if (v3_chkpt_load(ctx, "memory_img", vm->mem_size, guest_mem_base)) { - PrintError(vm, VCORE_NONE, "Unable to load all of memory (requested=%llu bytes, result=%llu bytes\n",(uint64_t)(vm->mem_size),ret); - v3_chkpt_close_ctx(ctx); + if (V3_CHKPT_LOAD(ctx, "region_size",saved_mem_block_size)) { + PrintError(vm, VCORE_NONE, "Unable to load memory region size\n"); + return -1; + } + + if (V3_CHKPT_LOAD(ctx, "num_regions",saved_num_base_regions)) { + PrintError(vm, VCORE_NONE, "Unable to load number of regions\n"); + return -1; + } + + if (saved_mem_block_size != v3_mem_block_size) { + PrintError(vm, VCORE_NONE, "Unable to load as memory block size differs\n"); + return -1; + } // support will eventually be added for this + + if (saved_num_base_regions != vm->mem_map.num_base_regions) { + PrintError(vm, VCORE_NONE, "Unable to laod as number of base regions differs\n"); return -1; + } // support will eventually be added for this + + for (i=0;imem_map.num_base_regions;i++) { + guest_mem_base = V3_VAddr((void *)vm->mem_map.base_regions[i].host_addr); + sprintf(buf,"memory_img%d",i); + if (v3_chkpt_load(ctx, buf, v3_mem_block_size, guest_mem_base)) { + PrintError(vm, VCORE_NONE, "Unable to load all of memory (region %d) (requested=%llu bytes, result=%llu bytes\n",i,(uint64_t)(vm->mem_size),ret); + v3_chkpt_close_ctx(ctx); + return -1; + } } v3_chkpt_close_ctx(ctx); @@ -340,9 +367,11 @@ static int load_memory(struct v3_vm_info * vm, struct v3_chkpt * chkpt) { static int save_memory(struct v3_vm_info * vm, struct v3_chkpt * chkpt) { void * guest_mem_base = NULL; void * ctx = NULL; + char buf[128]; // region name uint64_t ret = 0; + extern uint64_t v3_mem_block_size; + int i; - guest_mem_base = V3_VAddr((void *)vm->mem_map.base_region.host_addr); ctx = v3_chkpt_open_ctx(chkpt, "memory_img"); @@ -351,12 +380,26 @@ static int save_memory(struct v3_vm_info * vm, struct v3_chkpt * chkpt) { return -1; } - if (v3_chkpt_save(ctx, "memory_img", vm->mem_size, guest_mem_base)) { - PrintError(vm, VCORE_NONE, "Unable to save all of memory (requested=%llu, received=%llu)\n",(uint64_t)(vm->mem_size),ret); - v3_chkpt_close_ctx(ctx); + if (V3_CHKPT_SAVE(ctx, "region_size",v3_mem_block_size)) { + PrintError(vm, VCORE_NONE, "Unable to save memory region size\n"); return -1; } + if (V3_CHKPT_SAVE(ctx, "num_regions",vm->mem_map.num_base_regions)) { + PrintError(vm, VCORE_NONE, "Unable to save number of regions\n"); + return -1; + } + + for (i=0;imem_map.num_base_regions;i++) { + guest_mem_base = V3_VAddr((void *)vm->mem_map.base_regions[i].host_addr); + sprintf(buf,"memory_img%d",i); + if (v3_chkpt_save(ctx, buf, v3_mem_block_size, guest_mem_base)) { + PrintError(vm, VCORE_NONE, "Unable to save all of memory (region %d) (requested=%llu, received=%llu)\n",i,(uint64_t)(vm->mem_size),ret); + v3_chkpt_close_ctx(ctx); + return -1; + } + } + v3_chkpt_close_ctx(ctx); return 0; @@ -448,13 +491,10 @@ static int save_inc_memory(struct v3_vm_info * vm, int page_size_bytes = 1 << 12; // assuming 4k pages right now void * ctx = NULL; int i = 0; - void * guest_mem_base = NULL; int bitmap_num_bytes = (mod_pgs_to_send->num_bits / 8) + ((mod_pgs_to_send->num_bits % 8) > 0); - guest_mem_base = V3_VAddr((void *)vm->mem_map.base_region.host_addr); - PrintDebug(vm, VCORE_NONE, "Saving incremental memory.\n"); ctx = v3_chkpt_open_ctx(chkpt,"memory_bitmap_bits"); @@ -481,7 +521,12 @@ static int save_inc_memory(struct v3_vm_info * vm, // Dirty memory pages are sent in bitmap order for (i = 0; i < mod_pgs_to_send->num_bits; i++) { if (v3_bitmap_check(mod_pgs_to_send, i)) { - // PrintDebug(vm, VCORE_NONE, "Sending memory page %d.\n",i); + struct v3_mem_region *region = v3_get_base_region(vm,page_size_bytes * i); + if (!region) { + PrintError(vm, VCORE_NONE, "Failed to find base region for page %d\n",i); + return -1; + } + // PrintDebug(vm, VCORE_NONE, "Sending memory page %d.\n",i); ctx = v3_chkpt_open_ctx(chkpt, "memory_page"); if (!ctx) { PrintError(vm, VCORE_NONE, "Unable to open context to send memory page\n"); @@ -490,7 +535,7 @@ static int save_inc_memory(struct v3_vm_info * vm, if (v3_chkpt_save(ctx, "memory_page", page_size_bytes, - guest_mem_base + (page_size_bytes * i))) { + (void*)(region->host_addr + page_size_bytes * i - region->guest_start))) { PrintError(vm, VCORE_NONE, "Unable to send a memory page\n"); v3_chkpt_close_ctx(ctx); return -1; @@ -515,14 +560,11 @@ static int load_inc_memory(struct v3_vm_info * vm, int page_size_bytes = 1 << 12; // assuming 4k pages right now void * ctx = NULL; int i = 0; - void * guest_mem_base = NULL; bool empty_bitmap = true; int bitmap_num_bytes = (mod_pgs->num_bits / 8) + ((mod_pgs->num_bits % 8) > 0); - guest_mem_base = V3_VAddr((void *)vm->mem_map.base_region.host_addr); - ctx = v3_chkpt_open_ctx(chkpt, "memory_bitmap_bits"); if (!ctx) { @@ -544,7 +586,12 @@ static int load_inc_memory(struct v3_vm_info * vm, // Receive also follows bitmap order for (i = 0; i < mod_pgs->num_bits; i ++) { if (v3_bitmap_check(mod_pgs, i)) { - PrintDebug(vm, VCORE_NONE, "Loading page %d\n", i); + struct v3_mem_region *region = v3_get_base_region(vm,page_size_bytes * i); + if (!region) { + PrintError(vm, VCORE_NONE, "Failed to find base region for page %d\n",i); + return -1; + } + //PrintDebug(vm, VCORE_NONE, "Loading page %d\n", i); empty_bitmap = false; ctx = v3_chkpt_open_ctx(chkpt, "memory_page"); if (!ctx) { @@ -555,7 +602,7 @@ static int load_inc_memory(struct v3_vm_info * vm, if (v3_chkpt_load(ctx, "memory_page", page_size_bytes, - guest_mem_base + (page_size_bytes * i))) { + (void*)(region->host_addr + page_size_bytes * i - region->guest_start))) { PrintError(vm, VCORE_NONE, "Did not receive all of memory page\n"); v3_chkpt_close_ctx(ctx); return -1;