[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] Live migration leaves page tables read-only?

Ian Pratt wrote:
What happens if you use non-live relo?
I thought I had tested that way back at the beginning without seeing
problem, but I must not have, because I just retested it to be sure
it died the same way. (Now I am truly confused and I need to go back
re-examine some of my earlier experiments.)

After redoing some of my tests and understanding more about how Xen
handles page tables, I started looking at ptwr_do_page_fault() and put
debugging code into it. (On Xen 3.0.3 x86-64.)  The fixup is failing
x86_emulate_memop(). Building a debug version of Xen provided some
additional information (the final line is from my debugging, after the
":" is domid, addr, pte, pte flags, type_info, page owner, domain):

You say you can repro the problem using non-live relo. In that case, you
should also be able to repro it using save/restore, which has almost
identical code paths.

Please try and isolate whether the crash happens on save or restore, and
further whether a given saved images crashes every time in the same way
when you try and restore it (mfns will be different, but pfns may be the


I finally ran down the problem. SAP is protecting the pages PROT_NONE, so the page-present bit in the pte is not set and canonicalize/uncanonicalize code in save/restore ignore the pte. I've attached a patch. It is possible that this change should be made to the l1e tests in xc_ptrace.c; I'm not sure.

John Byrne

Signed-off-by: John Byrne <john.l.byrne@xxxxxx>
diff -r 1ad7dff99968 tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c    Fri Dec 08 18:37:19 2006 +0000
+++ b/tools/libxc/xc_linux_restore.c    Fri Dec 08 21:37:27 2006 -0600
@@ -73,7 +73,7 @@ static int uncanonicalize_pagetable(unsi
             pte = ((uint64_t *)page)[i];
-        if(pte & _PAGE_PRESENT) {
+        if(pte_present(pte)) {
             pfn = (pte >> PAGE_SHIFT) & 0xffffffff;
diff -r 1ad7dff99968 tools/libxc/xc_linux_save.c
--- a/tools/libxc/xc_linux_save.c       Fri Dec 08 18:37:19 2006 +0000
+++ b/tools/libxc/xc_linux_save.c       Fri Dec 08 21:36:59 2006 -0600
@@ -471,7 +471,7 @@ static int canonicalize_pagetable(unsign
         if (i >= xen_start && i < xen_end)
             pte = 0;
-        if (pte & _PAGE_PRESENT) {
+        if (pte_present(pte)) {
             mfn = (pte >> PAGE_SHIFT) & 0xfffffff;
             if (!MFN_IS_IN_PSEUDOPHYS_MAP(mfn)) {
diff -r 1ad7dff99968 tools/libxc/xg_private.h
--- a/tools/libxc/xg_private.h  Fri Dec 08 18:37:19 2006 +0000
+++ b/tools/libxc/xg_private.h  Fri Dec 08 17:48:49 2006 -0600
@@ -46,6 +46,10 @@ unsigned long csum_page (void * page);
 #define _PAGE_PSE       0x080
 #define _PAGE_GLOBAL    0x100
+#define _PAGE_PROTNONE 0x080 /* If not present */
+#define pte_present(_pteval)   ((_pteval) & (_PAGE_PRESENT|_PAGE_PROTNONE))
 #define L1_PAGETABLE_SHIFT_PAE   12
 #define L2_PAGETABLE_SHIFT_PAE   21
 #define L3_PAGETABLE_SHIFT_PAE   30
Xen-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.