From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Liu, Jinsong" Subject: Re: [PATCH 5/5] X86/vMCE: guest broken page handling when migration Date: Wed, 10 Oct 2012 14:42:30 +0000 Message-ID: References: <1349860894.10070.21.camel@zakaz.uk.xensource.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1349860894.10070.21.camel@zakaz.uk.xensource.com> Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Ian Campbell Cc: Christoph Egger , "xen-devel@lists.xensource.com" , "Keir (Xen.org)" , Jan Beulich List-Id: xen-devel@lists.xenproject.org Updated, thanks! w/ some comments below, will send out later. Ian Campbell wrote: > On Wed, 2012-09-19 at 09:15 +0100, Liu, Jinsong wrote: >> X86/vMCE: guest broken page handling when migration >> >> This patch is used to handle guest broken page when migration. >> >> At sender, the broken page would not be mapped, and the error page >> content would not be copied to target, otherwise it may trigger more >> serious error (i.e. SRAR error). While its pfn_type and pfn number >> would be transferred to target so that target take appropriate >> action. >> >> At target, it would set p2m as p2m_ram_broken for broken page, so >> that >> if guest access the broken page again, it would kill guest as >> expected. >> >> Signed-off-by: Liu, Jinsong >> >> diff -r a1d106d1aec8 tools/libxc/xc_domain.c >> --- a/tools/libxc/xc_domain.c Wed Sep 19 03:31:31 2012 +0800 >> +++ b/tools/libxc/xc_domain.c Wed Sep 19 04:22:26 2012 +0800 @@ >> -314,6 +314,22 @@ return ret ? -1 : 0; >> } >> >> +/* set broken page p2m */ >> +int xc_set_broken_page_p2m(xc_interface *xch, >> + uint32_t domid, >> + unsigned long pfn) >> +{ >> + int ret; >> + DECLARE_DOMCTL; >> + >> + domctl.cmd = XEN_DOMCTL_set_broken_page_p2m; >> + domctl.domain = (domid_t)domid; >> + domctl.u.set_broken_page_p2m.pfn = pfn; >> + ret = do_domctl(xch, &domctl); >> + >> + return ret ? -1 : 0; >> +} >> + >> /* get info from hvm guest for save */ >> int xc_domain_hvm_getcontext(xc_interface *xch, >> uint32_t domid, >> diff -r a1d106d1aec8 tools/libxc/xc_domain_restore.c >> --- a/tools/libxc/xc_domain_restore.c Wed Sep 19 03:31:31 2012 +0800 >> +++ b/tools/libxc/xc_domain_restore.c Wed Sep 19 04:22:26 2012 +0800 >> @@ -962,9 +962,15 @@ >> >> countpages = count; >> for (i = oldcount; i < buf->nr_pages; ++i) >> - if ((buf->pfn_types[i] & XEN_DOMCTL_PFINFO_LTAB_MASK) == >> XEN_DOMCTL_PFINFO_XTAB >> - ||(buf->pfn_types[i] & XEN_DOMCTL_PFINFO_LTAB_MASK) == >> XEN_DOMCTL_PFINFO_XALLOC) + { + unsigned long pagetype; >> + >> + pagetype = buf->pfn_types[i] & XEN_DOMCTL_PFINFO_LTAB_MASK; >> + if ( pagetype == XEN_DOMCTL_PFINFO_XTAB || >> + pagetype == XEN_DOMCTL_PFINFO_BROKEN || >> + pagetype == XEN_DOMCTL_PFINFO_XALLOC ) >> --countpages; + } >> >> if (!countpages) >> return count; >> @@ -1200,6 +1206,17 @@ >> /* a bogus/unmapped/allocate-only page: skip it */ >> continue; >> >> + if ( pagetype == XEN_DOMCTL_PFINFO_BROKEN ) + { >> + if ( xc_set_broken_page_p2m(xch, dom, pfn) ) + >> { + ERROR("Set p2m for broken page fail, " > > "failed" > >> + "dom=%d, pfn=%lx\n", dom, pfn); >> + goto err_mapped; >> + } >> + continue; >> + } >> + >> if (pfn_err[i]) >> { >> ERROR("unexpected PFN mapping failure pfn %lx map_mfn >> %lx p2m_mfn %lx", >> diff -r a1d106d1aec8 xen/include/public/domctl.h >> --- a/xen/include/public/domctl.h Wed Sep 19 03:31:31 2012 +0800 >> +++ b/xen/include/public/domctl.h Wed Sep 19 04:22:26 2012 +0800 @@ >> -136,6 +136,7 @@ #define XEN_DOMCTL_PFINFO_LPINTAB (0x1U<<31) >> #define XEN_DOMCTL_PFINFO_XTAB (0xfU<<28) /* invalid page */ >> #define XEN_DOMCTL_PFINFO_XALLOC (0xeU<<28) /* allocate-only page >> */ +#define XEN_DOMCTL_PFINFO_BROKEN (0xdU<<28) /* broken page */ >> #define XEN_DOMCTL_PFINFO_PAGEDTAB (0x8U<<28) >> #define XEN_DOMCTL_PFINFO_LTAB_MASK (0xfU<<28) >> >> @@ -834,6 +835,12 @@ >> typedef struct xen_domctl_vmce_monitor xen_domctl_vmce_monitor_t; >> DEFINE_XEN_GUEST_HANDLE(xen_domctl_vmce_monitor_t); >> >> +struct xen_domctl_set_broken_page_p2m { >> + uint64_t pfn; >> +}; > > why not xen_pfn_t? or uint64_aligned_t? > > Is domctl the right interface for this? Seems like more of an add to > physmap thing? > Hmm, broken page still belong to the domain so don't need touch physmap (like what mce handle broken page at sender side: just unmap p2m is OK). As for domctl, my thinking is, it's per domain staff (belong to the field of domain control/management), setting p2m entry for broken page of a domain. Thanks, Jinsong >> +typedef struct xen_domctl_set_broken_page_p2m >> xen_domctl_set_broken_page_p2m_t; >> +DEFINE_XEN_GUEST_HANDLE(xen_domctl_set_broken_page_p2m_t); + >> struct xen_domctl { uint32_t cmd; >> #define XEN_DOMCTL_createdomain 1 @@ -901,6 >> +908,7 @@ #define XEN_DOMCTL_set_virq_handler 66 >> #define XEN_DOMCTL_vmce_monitor_start 67 >> #define XEN_DOMCTL_vmce_monitor_end 68 >> +#define XEN_DOMCTL_set_broken_page_p2m 69 >> #define XEN_DOMCTL_gdbsx_guestmemio 1000 >> #define XEN_DOMCTL_gdbsx_pausevcpu 1001 >> #define XEN_DOMCTL_gdbsx_unpausevcpu 1002 @@ -957,6 >> +965,7 @@ struct xen_domctl_set_virq_handler >> set_virq_handler; struct xen_domctl_vmce_monitor >> vmce_monitor; struct xen_domctl_gdbsx_memio >> gdbsx_guest_memio; + struct xen_domctl_set_broken_page_p2m >> set_broken_page_p2m; struct xen_domctl_gdbsx_pauseunp_vcpu >> gdbsx_pauseunp_vcpu; struct xen_domctl_gdbsx_domstatus >> gdbsx_domstatus; uint8_t >> pad[128];