From: Peter Dinda Date: Wed, 28 Aug 2013 13:58:57 +0000 (-0500) Subject: Checkpoint/Restore fixes X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=5d20e4fc3a9b5b9cf762e67c23f817986d802bb7 Checkpoint/Restore fixes - handles multi-base region VMs with distinct tags for each base region - checks to see if restore VM's region setup is identical to the checkpoint VM's before proceeding (this will eventually be expanded to do translation) - minor fix to keyed stream to support large files - minor error fix to save/restore of serial --- diff --git a/linux_module/iface-keyed-stream.c b/linux_module/iface-keyed-stream.c index 3b36d6a..0381aa4 100644 --- a/linux_module/iface-keyed-stream.c +++ b/linux_module/iface-keyed-stream.c @@ -810,8 +810,8 @@ static v3_keyed_stream_key_t open_key_file(v3_keyed_stream_t stream, fs->stype=STREAM_FILE; - fs->f = filp_open(path,O_RDWR|O_CREAT,0600); - + fs->f = filp_open(path,O_RDWR|O_CREAT|O_LARGEFILE,0600); + if (IS_ERR(fs->f)) { ERROR("cannot open relevent file \"%s\" for stream \"file:%s\" and key \"%s\"\n",path,fks->path,key); palacios_free(fs); diff --git a/palacios/src/devices/serial.c b/palacios/src/devices/serial.c index 85eecc8..288dbeb 100644 --- a/palacios/src/devices/serial.c +++ b/palacios/src/devices/serial.c @@ -1456,12 +1456,12 @@ static int serial_load(struct v3_chkpt_ctx * ctx, void * private_data) { snprintf(keyname, 128,"COM%d_int_state",i); V3_CHKPT_LOAD(ctx, keyname, serial->int_state,failout); - if (serial_buffer_load(ctx, i, &(serial->tx_buffer), "RX")) { + if (serial_buffer_load(ctx, i, &(serial->tx_buffer), "TX")) { PrintError(VM_NONE, VCORE_NONE, "Failed to load serial tx buffer %d\n",i); goto failout; } - if (serial_buffer_load(ctx, i, &(serial->rx_buffer), "TX")) { + if (serial_buffer_load(ctx, i, &(serial->rx_buffer), "RX")) { PrintError(VM_NONE, VCORE_NONE, "Failed to load serial rx buffer %d\n",i); goto failout; } diff --git a/palacios/src/palacios/vmm_checkpoint.c b/palacios/src/palacios/vmm_checkpoint.c index 3872abb..92c5e16 100644 --- a/palacios/src/palacios/vmm_checkpoint.c +++ b/palacios/src/palacios/vmm_checkpoint.c @@ -315,6 +315,9 @@ 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; + uint64_t saved_mem_block_size; + uint32_t saved_num_base_regions; + char buf[128]; int i; extern uint64_t v3_mem_block_size; @@ -325,10 +328,30 @@ static int load_memory(struct v3_vm_info * vm, struct v3_chkpt * chkpt) { return -1; } + 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); - if (v3_chkpt_load(ctx, "memory_img", v3_mem_block_size, guest_mem_base)) { + 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; @@ -344,6 +367,7 @@ 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; @@ -356,9 +380,20 @@ static int save_memory(struct v3_vm_info * vm, struct v3_chkpt * chkpt) { return -1; } + 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); - if (v3_chkpt_save(ctx, "memory_img", v3_mem_block_size, guest_mem_base)) { + 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;