|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [Patch 7] Xen/MCE: Abort live migration when vMCE occur
Christoph Egger wrote:
> On 07/27/12 17:24, Liu, Jinsong wrote:
>
>> Xen/MCE: Abort live migration when vMCE occur
>>
>> This patch monitor the critical area of live migration (from vMCE
>> point of view,
>> the copypages stage of migration is the critical area while other
>> areas are not).
>>
>> If a vMCE occur at the critical area of live migration, abort and
>> try migration later.
>>
>> Signed-off-by: Liu, Jinsong <jinsong.liu@xxxxxxxxx>
>>
>> diff -r 8869ba37b577 tools/libxc/xc_domain.c
>> --- a/tools/libxc/xc_domain.c Thu Jul 19 22:14:08 2012 +0800
>> +++ b/tools/libxc/xc_domain.c Thu Jul 26 22:52:09 2012 +0800 @@
>> -283,6 +283,37 @@ return ret;
>> }
>>
>> +/* Start vmce monitor */
>> +int xc_domain_vmce_monitor_strat(xc_interface *xch,
>> + uint32_t domid)
>> +{
>> + int ret;
>> + DECLARE_DOMCTL;
>> +
>> + domctl.cmd = XEN_DOMCTL_vmce_monitor_start;
>> + domctl.domain = (domid_t)domid;
>> + ret = do_domctl(xch, &domctl);
>> +
>> + return ret ? -1 : 0;
>> +}
>> +
>> +/* End vmce monitor */
>> +int xc_domain_vmce_monitor_end(xc_interface *xch,
>> + uint32_t domid,
>> + int *vmce_while_migrate) +{
>> + int ret;
>> + DECLARE_DOMCTL;
>> +
>> + domctl.cmd = XEN_DOMCTL_vmce_monitor_end;
>> + domctl.domain = (domid_t)domid;
>> + ret = do_domctl(xch, &domctl);
>> + if ( !ret )
>> + *vmce_while_migrate =
>> domctl.u.vmce_monitor.vmce_while_migrate; + + return ret ? -1 : 0;
>> +}
>> +
>> /* get info from hvm guest for save */
>> int xc_domain_hvm_getcontext(xc_interface *xch,
>> uint32_t domid,
>> diff -r 8869ba37b577 tools/libxc/xc_domain_save.c
>> --- a/tools/libxc/xc_domain_save.c Thu Jul 19 22:14:08 2012 +0800
>> +++ b/tools/libxc/xc_domain_save.c Thu Jul 26 22:52:09 2012 +0800 @@
>> -895,6 +895,8 @@ */
>> int compressing = 0;
>>
>> + int vmce_while_migrate = 0;
>> +
>> int completed = 0;
>>
>> if ( hvm && !callbacks->switch_qemu_logdirty ) @@ -1109,6
>> +1111,12 @@ goto out;
>> }
>>
>> + if ( xc_domain_vmce_monitor_strat(xch, dom) )
>
>
> You mean s/strat/start/ here, right?
Yep, thanks! will update.
Jinsong
>
>> + {
>> + PERROR("Error when start vmce monitor\n"); + goto
>> out; + }
>> +
>> copypages:
>> #define wrexact(fd, buf, len) write_buffer(xch, last_iter, ob,
>> (fd), (buf), (len)) #define wruncached(fd, live, buf, len)
>> write_uncached(xch, last_iter, ob, (fd), (buf), (len)) @@ -1571,6
>> +1579,17 @@
>>
>> DPRINTF("All memory is saved\n");
>>
>> + if ( xc_domain_vmce_monitor_end(xch, dom, &vmce_while_migrate)
>> ) + { + PERROR("Error when end vmce monitor\n");
>> + goto out;
>> + }
>> + else if ( vmce_while_migrate )
>> + {
>> + fprintf(stderr, "vMCE occurred, abort this time and try
>> later.\n"); + goto out; + }
>> +
>> /* After last_iter, buffer the rest of pagebuf & tailbuf data
>> into a * separate output buffer and flush it after the
>> compressed page chunks. */
>> diff -r 8869ba37b577 tools/libxc/xenctrl.h
>> --- a/tools/libxc/xenctrl.h Thu Jul 19 22:14:08 2012 +0800
>> +++ b/tools/libxc/xenctrl.h Thu Jul 26 22:52:09 2012 +0800 @@ -568,6
>> +568,26 @@ xc_domaininfo_t *info);
>>
>> /**
>> + * This function start monitor vmce event.
>> + * @parm xch a handle to an open hypervisor interface
>> + * @parm domid the domain id monitored
>> + * @return 0 on success, -1 on failure
>> + */
>> +int xc_domain_vmce_monitor_strat(xc_interface *xch,
>> + uint32_t domid);
>
> Dito.
>
> Christoph
>
>> +/**
>> + * This function end monitor vmce event
>> + * @parm xch a handle to an open hypervisor interface
>> + * @parm domid the domain id monitored
>> + * @parm vmce_while_migrate a pointer return whether vMCE occur
>> when migrate + * @return 0 on success, -1 on failure
>> + */
>> +int xc_domain_vmce_monitor_end(xc_interface *xch,
>> + uint32_t domid,
>> + int *vmce_while_migrate); +
>> +/**
>> * This function returns information about the context of a hvm
>> domain
>> * @parm xch a handle to an open hypervisor interface
>> * @parm domid the domain to get information from
>> diff -r 8869ba37b577 xen/arch/x86/cpu/mcheck/mce_intel.c
>> --- a/xen/arch/x86/cpu/mcheck/mce_intel.c Thu Jul 19 22:14:08 2012
>> +0800 +++ b/xen/arch/x86/cpu/mcheck/mce_intel.c Thu Jul 26 22:52:09
>> 2012 +0800 @@ -688,6 +688,12 @@ goto
>> vmce_failed; }
>>
>> + if ( unlikely(d->arch.vmce_monitor) ) +
>> { + /* vMCE occur when guest migration */
>> + d->arch.vmce_while_migrate = 1; +
>> } +
>> /* We will inject vMCE to DOMU*/
>> if ( inject_vmce(d) < 0 )
>> {
>> diff -r 8869ba37b577 xen/arch/x86/domctl.c
>> --- a/xen/arch/x86/domctl.c Thu Jul 19 22:14:08 2012 +0800
>> +++ b/xen/arch/x86/domctl.c Thu Jul 26 22:52:09 2012 +0800 @@
>> -1517,6 +1517,41 @@ }
>> break;
>>
>> + case XEN_DOMCTL_vmce_monitor_start:
>> + {
>> + struct domain *d;
>> +
>> + d = rcu_lock_domain_by_id(domctl->domain); + if ( d
>> != NULL ) + {
>> + d->arch.vmce_while_migrate = 0;
>> + d->arch.vmce_monitor = 1;
>> + rcu_unlock_domain(d);
>> + }
>> + else
>> + ret = -ESRCH;
>> + }
>> + break;
>> +
>> + case XEN_DOMCTL_vmce_monitor_end:
>> + {
>> + struct domain *d;
>> +
>> + d = rcu_lock_domain_by_id(domctl->domain); + if ( d
>> != NULL) + {
>> + d->arch.vmce_monitor = 0;
>> + domctl->u.vmce_monitor.vmce_while_migrate =
>> + d->arch.vmce_while_migrate;
>> + rcu_unlock_domain(d);
>> + if ( copy_to_guest(u_domctl, domctl, 1) )
>> + ret = -EFAULT;
>> + }
>> + else
>> + ret = -ESRCH;
>> + }
>> + break;
>> +
>> default:
>> ret = iommu_do_domctl(domctl, u_domctl);
>> break;
>> diff -r 8869ba37b577 xen/include/asm-x86/domain.h
>> --- a/xen/include/asm-x86/domain.h Thu Jul 19 22:14:08 2012 +0800
>> +++ b/xen/include/asm-x86/domain.h Thu Jul 26 22:52:09 2012 +0800 @@
>> -292,6 +292,10 @@ bool_t has_32bit_shinfo;
>> /* Domain cannot handle spurious page faults? */
>> bool_t suppress_spurious_page_faults;
>> + /* Monitoring guest memory copy of migration */ + bool_t
>> vmce_monitor; + /* Whether vMCE occur during guest memory copy of
>> migration */ + bool_t vmce_while_migrate;
>>
>> /* Continuable domain_relinquish_resources(). */ enum {
>> diff -r 8869ba37b577 xen/include/public/domctl.h
>> --- a/xen/include/public/domctl.h Thu Jul 19 22:14:08 2012 +0800
>> +++ b/xen/include/public/domctl.h Thu Jul 26 22:52:09 2012 +0800 @@
>> -850,6 +850,12 @@ typedef struct xen_domctl_set_access_required
>> xen_domctl_set_access_required_t;
>> DEFINE_XEN_GUEST_HANDLE(xen_domctl_set_access_required_t);
>>
>> +struct xen_domctl_vmce_monitor {
>> + uint8_t vmce_while_migrate;
>> +};
>> +typedef struct xen_domctl_vmce_monitor xen_domctl_vmce_monitor_t;
>> +DEFINE_XEN_GUEST_HANDLE(xen_domctl_vmce_monitor_t); +
>> struct xen_domctl {
>> uint32_t cmd;
>> #define XEN_DOMCTL_createdomain 1 @@ -915,6
>> +921,8 @@ #define XEN_DOMCTL_set_access_required 64
>> #define XEN_DOMCTL_audit_p2m 65
>> #define XEN_DOMCTL_set_virq_handler 66
>> +#define XEN_DOMCTL_vmce_monitor_start 67
>> +#define XEN_DOMCTL_vmce_monitor_end 68
>> #define XEN_DOMCTL_gdbsx_guestmemio 1000
>> #define XEN_DOMCTL_gdbsx_pausevcpu 1001
>> #define XEN_DOMCTL_gdbsx_unpausevcpu 1002 @@ -970,6
>> +978,7 @@ struct xen_domctl_set_access_required
>> access_required; struct xen_domctl_audit_p2m
>> audit_p2m; 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_gdbsx_pauseunp_vcpu
>> gdbsx_pauseunp_vcpu; struct xen_domctl_gdbsx_domstatus
>> gdbsx_domstatus;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |