[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 seeingtheproblem, but I must not have, because I just retested it to be sureandit died the same way. (Now I am truly confused and I need to go backandre-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 failinginx86_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 same).Ian 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 else 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 Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |