|
[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
>>> On 27.07.12 at 17:24, "Liu, Jinsong" <jinsong.liu@xxxxxxxxx> 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) )
> + {
> + 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);
> +
> +/**
> + * 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;
Let's name this what it is - e.g. vmce_while_monitor -, at the
hypervisor level this got nothing to do with migration (it's only
the tools who want to use it for this purpose).
Given the constant growth of struct domain, I also wonder
whether a single variable s8 wouldn't suffice: e.g. 0 - not
monitoring, > 0 - monitoring, < 0 - vMCE occurred while
monitoring.
Jan
>
> /* 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 |