Skip to contentSkip to conversation

HVM live migration fixes

PATCH New Brendan Cully 1 participant 3 messages Jan 20, 2010

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 HVM live migration fixes

I need the following two patches in order to live migrate HVM guests.

#1 lore raw

PATCH 1/1 Unbreak live migration with tapdisk2 after 20691:054042ba73b6

# HG changeset patch
# User Brendan Cully <[email protected]>
# Date 1264027323 28800
# Node ID 3a6f73240fbd5e66cb7b4c8f84a91513615cc806 # Parent fe58c98dd43f370b5461e3ad451b2520dd6b9e2e Unbreak live migration with tapdisk2 after 20691:054042ba73b6

vm.image does not exist at this point in the restore process. I haven't looked at the memory_sharing code. It's likely something better is needed to make that work across relocation.

tools/python/xen/xend/server/BlktapController.py +1 -1
@@ -198,7 +198,7 @@
                     self.deviceClass = 'tap2'
                     return devid
 
-        if self.vm.image.memory_sharing:
+        if self.vm.image and self.vm.image.memory_sharing:
             cmd = [ TAPDISK_BINARY, '-n', '%s:%s' % (params, file), '-s', '%d' % self.vm.getDomid() ]
         else:
             cmd = [ TAPDISK_BINARY, '-n', '%s:%s' % (params, file) ]
#2 lore raw

PATCH 1/1 Unbreak HVM live migration after 0b138a019292

In reply to Brendan Cully

# HG changeset patch
# User Brendan Cully <[email protected]>
# Date 1264031014 28800
# Node ID 7ba22c778aac4e4041eba86c32916694deeeabf7 # Parent 3a6f73240fbd5e66cb7b4c8f84a91513615cc806 Unbreak HVM live migration after 0b138a019292.

0b138a019292 was a little too ambitious replacing xc_map_foreign_batch with xc_map_foreign_pages in xc_domain_restore. With HVM, some of the mappings are expected to fail (as "XTAB" pages).

tools/libxc/xc_domain_restore.c +20 -6
@@ -1171,6 +1171,8 @@
     unsigned long *page = NULL;
     int nraces = 0;
     struct domain_info_context *dinfo = &ctx->dinfo;
+    int* pfn_err = NULL;
+    int rc = -1;
 
     unsigned long mfn, pfn, pagetype;
 
@@ -1186,12 +1188,14 @@
     }
 
     /* Map relevant mfns */
-    region_base = xc_map_foreign_pages(
-        xc_handle, dom, PROT_WRITE, region_mfn, j);
+    pfn_err = calloc(j, sizeof(*pfn_err));
+    region_base = xc_map_foreign_bulk(
+        xc_handle, dom, PROT_WRITE, region_mfn, pfn_err, j);
 
     if ( region_base == NULL )
     {
         ERROR("map batch failed");
+        free(pfn_err);
         return -1;
     }
 
@@ -1204,12 +1208,18 @@
             /* a bogus/unmapped page: skip it */
             continue;
 
+        if (pfn_err[i])
+        {
+            ERROR("unexpected PFN mapping failure");
+            goto err_mapped;
+        }
+
         ++curpage;
 
         if ( pfn > dinfo->p2m_size )
         {
             ERROR("pfn out of range");
-            return -1;
+            goto err_mapped;
         }
 
         pfn_type[pfn] = pagetype;
@@ -1257,7 +1267,7 @@
         {
             ERROR("Bogus page type %lx page table is out of range: "
                   "i=%d p2m_size=%lu", pagetype, i, dinfo->p2m_size);
-            return -1;
+            goto err_mapped;
         }
 
         if ( pagebuf->verify )
@@ -1288,13 +1298,17 @@
                                | MMU_MACHPHYS_UPDATE, pfn) )
         {
             ERROR("failed machpys update mfn=%lx pfn=%lx", mfn, pfn);
-            return -1;
+            goto err_mapped;
         }
     } /* end of 'batch' for loop */
 
+    rc = nraces;
+
+  err_mapped:
     munmap(region_base, j*PAGE_SIZE);
+    free(pfn_err);
 
-    return nraces;
+    return rc;
 }
 
 int xc_domain_restore(int xc_handle, int io_fd, uint32_t dom,