aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-01-21 09:03:20 +0000
committerKeir Fraser <keir.fraser@citrix.com>2010-01-21 09:03:20 +0000
commitd7efbf3bac545fca8c591dd20422ba8fe5c1c4af (patch)
tree51d0808efb6e643d8a76a554e0af5f8ff73693a0
parent1e4743291b9e4fd7b131d9de03dcfd8a72682fd0 (diff)
downloadxen-d7efbf3bac545fca8c591dd20422ba8fe5c1c4af.tar.gz
xen-d7efbf3bac545fca8c591dd20422ba8fe5c1c4af.tar.bz2
xen-d7efbf3bac545fca8c591dd20422ba8fe5c1c4af.zip
libxc: 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@cs.ubc.ca>
-rw-r--r--tools/libxc/xc_domain_restore.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/tools/libxc/xc_domain_restore.c b/tools/libxc/xc_domain_restore.c
index 3999569582..23a73730c3 100644
--- a/tools/libxc/xc_domain_restore.c
+++ b/tools/libxc/xc_domain_restore.c
@@ -1171,6 +1171,8 @@ static int apply_batch(int xc_handle, uint32_t dom, struct restore_ctx *ctx,
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 @@ static int apply_batch(int xc_handle, uint32_t dom, struct restore_ctx *ctx,
}
/* 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 @@ static int apply_batch(int xc_handle, uint32_t dom, struct restore_ctx *ctx,
/* 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 @@ static int apply_batch(int xc_handle, uint32_t dom, struct restore_ctx *ctx,
{
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 @@ static int apply_batch(int xc_handle, uint32_t dom, struct restore_ctx *ctx,
| 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,