Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Checkpoint/Restore fixes
Peter Dinda [Wed, 28 Aug 2013 13:58:57 +0000 (08:58 -0500)]
  - 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

linux_module/iface-keyed-stream.c
palacios/src/devices/serial.c
palacios/src/palacios/vmm_checkpoint.c

index 3b36d6a..0381aa4 100644 (file)
@@ -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);
index 85eecc8..288dbeb 100644 (file)
@@ -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;
     }
index 3872abb..92c5e16 100644 (file)
@@ -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;i<vm->mem_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;i<vm->mem_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;