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

Re: [Xen-devel] [PATCH 5/5] X86/vMCE: guest broken page handling when migration



George Dunlap wrote:
> On Fri, Oct 19, 2012 at 4:14 PM, Ian Jackson
> <Ian.Jackson@xxxxxxxxxxxxx> wrote: 
>> Liu, Jinsong writes ("[Xen-devel] [PATCH 5/5] X86/vMCE: guest broken
>> page handling when migration"): 
>>> X86/vMCE: guest broken page handling when migration
>>> 
>>> This patch is used to handle guest broken page when migration.
>> 
>> This looks plausible to me, as far as the tools go.  Can you explain
>> how you have tested this ?  Did you manage to do any tests of the
>> remus codepaths ?
> 
> I'm pretty sure that this shouldn't cause any problems with Remus.  If
> it's difficult for Jinsong to test Remus, I think probably OK to
> commit it, and then revert it if the Remus guys have any problems.
> 
>  -George

Attached are 2 test program, my test steps are,
1. at sender, inject a vmce to guest, scan & record the broken page (pfn1)
2. do live migration, success;
3. at target, scan the broken page (pfn2) and compare
4. pfn1 = pfn2

I tested live migration, but not remus.

Thanks,
Jinsong

===============
test program 1:

diff -r ad02805c77b8 xen/arch/x86/cpu/mcheck/vmce.c
--- a/xen/arch/x86/cpu/mcheck/vmce.c    Sat Jul 28 06:35:47 2012 +0800
+++ b/xen/arch/x86/cpu/mcheck/vmce.c    Sat Aug 25 04:01:19 2012 +0800
@@ -28,6 +28,7 @@
 #include <xen/smp.h>
 #include <xen/mm.h>
 #include <xen/hvm/save.h>
+#include <xen/keyhandler.h>
 #include <asm/processor.h>
 #include <public/sysctl.h>
 #include <asm/system.h>
@@ -449,3 +450,93 @@
     return rc;
 }
 
+
+/***************************************************/
+
+unsigned long broken_pfn = 0;
+
+static void sender_broken_page(unsigned char key)
+{
+    domid_t sender_domid = 1;
+    struct domain *d;
+    struct p2m_domain *p2m;
+    unsigned long pfn;
+    p2m_type_t pt;
+
+    d = rcu_lock_domain_by_id(sender_domid);
+    p2m = p2m_get_hostp2m(d);
+
+    for ( pfn = 0; pfn < p2m->max_mapped_pfn; pfn++ )
+    {
+        get_gfn_query(d, pfn, &pt);
+        if ( unlikely(p2m_is_broken(pt)) )
+        {
+            printk("!!!!!! before migration, find broken page, "
+                   "dom = %d, pfn = %lx, pt = %d\n",
+                    (unsigned int)d->domain_id, pfn, (unsigned int)pt);
+            broken_pfn = pfn;
+        }
+        put_gfn(d, pfn);
+    }
+
+    rcu_unlock_domain(d);
+}
+
+static struct keyhandler sender_broken_page_keyhandler = {
+    .diagnostic = 1,
+    .u.fn = sender_broken_page,
+};
+
+static __init int sender_broken_page_init(void)
+{
+    register_keyhandler('6', &sender_broken_page_keyhandler);
+    return 0;
+}
+__initcall(sender_broken_page_init);
+
+/****************************************************/
+
+
+static void target_broken_page(unsigned char key)
+{
+    domid_t target_domid = 2;
+    struct domain *d;
+    struct p2m_domain *p2m;
+    unsigned long pfn;
+    p2m_type_t pt;
+
+    d = rcu_lock_domain_by_id(target_domid);
+    p2m = p2m_get_hostp2m(d);
+
+    for ( pfn = 0; pfn < p2m->max_mapped_pfn; pfn++ )
+    {
+        get_gfn_query(d, pfn, &pt);
+        if ( unlikely(p2m_is_broken(pt)) )
+            printk("@@@@@@ after migration, find broken page, "
+                   "dom = %d, pfn = %lx, pt = %d\n",
+                    (unsigned int)d->domain_id, pfn, (unsigned int)pt);
+        put_gfn(d, pfn);
+    }
+
+    get_gfn_query(d, broken_pfn, &pt);
+    printk("@@@@@@ after migration, broken_pfn type is, "
+           "dom = %d, broken_pfn = %lx, pt = %d\n",
+           (unsigned int)d->domain_id, broken_pfn, (unsigned int)pt);
+    put_gfn(d, broken_pfn);
+
+    rcu_unlock_domain(d);
+}
+
+static struct keyhandler target_broken_page_keyhandler = {
+    .diagnostic = 1,
+    .u.fn = target_broken_page,
+};
+
+static __init int target_broken_page_init(void)
+{
+    register_keyhandler('7', &target_broken_page_keyhandler);
+    return 0;
+}
+__initcall(target_broken_page_init);
+
+/*****************************************************/

===============
test program 2:

diff -r de462f2f1db8 tools/libxc/xc_domain_restore.c
--- a/tools/libxc/xc_domain_restore.c   Mon Aug 27 21:38:11 2012 +0800
+++ b/tools/libxc/xc_domain_restore.c   Mon Aug 27 21:56:53 2012 +0800
@@ -1207,8 +1207,11 @@
 
         if ( pagetype == XEN_DOMCTL_PFINFO_BROKEN )
         {
+            fprintf(stderr, "@target, find broken page, "
+                      "dom=%d, pfn=0x%lx, pagetype=0x%lx\n", dom, pfn, 
pagetype);
             if ( xc_set_broken_page_p2m(xch, dom, pfn) )
             {
+                fprintf(stderr, "... ERROR WHEN SET P2M FOR BROKEN PAGE\n");
                 ERROR("Set p2m for broken page fail, "
                       "dom=%d, pfn=%lx\n", dom, pfn);
                 goto err_mapped;
diff -r de462f2f1db8 tools/libxc/xc_domain_save.c
--- a/tools/libxc/xc_domain_save.c      Mon Aug 27 21:38:11 2012 +0800
+++ b/tools/libxc/xc_domain_save.c      Mon Aug 27 21:56:53 2012 +0800
@@ -1289,6 +1289,9 @@
                 {
                     pfn_type[j] |= pfn_batch[j];
                     ++run;
+                    fprintf(stderr, "@sender, find broken page, "
+                            "pfn_err[0x%x]=%d, pfn_type[0x%x] =%lx\n",
+                    (int)j, (int)pfn_err[j], (int)j, (unsigned 
long)pfn_type[j]);
                     continue;
                 }
 
diff -r de462f2f1db8 xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c     Mon Aug 27 21:38:11 2012 +0800
+++ b/xen/arch/x86/domctl.c     Mon Aug 27 21:56:53 2012 +0800
@@ -1566,13 +1566,19 @@
         struct domain *d;
         p2m_type_t pt;
         unsigned long pfn;
+        mfn_t r_mfn;
 
         d = rcu_lock_domain_by_id(domctl->domain);
         if ( d != NULL )
         {
             pfn = domctl->u.set_broken_page_p2m.pfn;
 
-            get_gfn_query(d, pfn, &pt);
+            r_mfn = get_gfn_query(d, pfn, &pt);
+            printk("@XEN_DOMCTL_set_broken_page_p2m, before set p2m, "
+                   "pfn=%lx, pt=%d\n", pfn, (int)pt);
+            if (!mfn_valid(mfn_x(r_mfn)))
+                printk("r_mfn IS INVALID!!!\n");
+
             p2m_change_type(d, pfn, pt, p2m_ram_broken);
             put_gfn(d, pfn);
 =============

Attachment: test1.patch
Description: test1.patch

Attachment: test2.patch
Description: test2.patch

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

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