# HG changeset patch
# User smh22@xxxxxxxxxxxxxxxxxxxx
# Node ID d46553f73c6f8ebef2b4a2d1605957c47550792b
# Parent 5ae89ce6748640a35e0866a7fe3ca258c03214be
Tolerate temporary inconsistency between type info and page contents on
(live) restore. This should now enable live migrate of fork-intensive (or
other page-table-intensive) workloads.
Signed-off-by: Steven Hand <steven@xxxxxxxxxxxxx>
diff -r 5ae89ce67486 -r d46553f73c6f tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c Fri Nov 25 15:26:19 2005
+++ b/tools/libxc/xc_linux_restore.c Fri Nov 25 16:53:41 2005
@@ -78,6 +78,7 @@
pfn = (pte >> PAGE_SHIFT) & 0xffffffff;
if(pfn >= max_pfn) {
+ /* This "page table page" is probably not one; bail. */
ERR("Frame number in type %lu page table is out of range: "
"i=%d pfn=0x%lx max_pfn=%lu",
type >> 28, i, pfn, max_pfn);
@@ -111,6 +112,7 @@
unsigned long mfn, pfn;
unsigned int prev_pc, this_pc;
int verify = 0;
+ int nraces = 0;
/* The new domain's shared-info frame number. */
unsigned long shared_info_frame;
@@ -344,8 +346,15 @@
if(pt_levels != 3 || pagetype != L1TAB) {
if(!uncanonicalize_pagetable(pagetype, page)) {
- ERR("failed uncanonicalize pt!\n");
- goto out;
+ /*
+ ** Failing to uncanonicalize a page table can be ok
+ ** under live migration since the pages type may have
+ ** changed by now (and we'll get an update later).
+ */
+ DPRINTF("PT L%ld race on pfn=%08lx mfn=%08lx\n",
+ pagetype >> 28, pfn, mfn);
+ nraces++;
+ continue;
}
}
@@ -394,7 +403,7 @@
n+= j; /* crude stats */
}
- DPRINTF("Received all pages\n");
+ DPRINTF("Received all pages (%d races)\n", nraces);
if(pt_levels == 3) {
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|