WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 2 of 2] Unbreak HVM live migration after 0b138a019292

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH 2 of 2] Unbreak HVM live migration after 0b138a019292
From: Brendan Cully <brendan@xxxxxxxxx>
Date: Wed, 20 Jan 2010 15:44:41 -0800
Delivery-date: Wed, 20 Jan 2010 15:47:26 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1264031079@xxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <patchbomb.1264031079@xxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mercurial-patchbomb/1.4.2+41-4441e8d7f04f
# HG changeset patch
# User Brendan Cully <brendan@xxxxxxxxx>
# 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).

Signed-off-by: Brendan Cully <brendan@xxxxxxxxx>

diff --git a/tools/libxc/xc_domain_restore.c b/tools/libxc/xc_domain_restore.c
--- a/tools/libxc/xc_domain_restore.c
+++ b/tools/libxc/xc_domain_restore.c
@@ -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,

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>