[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 COLOPre 02/13] tools/libxc: support to resume uncooperative HVM guests
On Thu, 2015-06-11 at 10:42 +0800, Wen Congyang wrote: > On 06/10/2015 11:18 PM, Ian Campbell wrote: > > On Mon, 2015-06-08 at 11:43 +0800, Yang Hongyang wrote: > >> From: Wen Congyang <wency@xxxxxxxxxxxxxx> > >> > >> For PVHVM, the hypercall return code is 0, and it can be resumed > >> in a new domain context. > >> we suspend PVHVM and resume it is like this: > >> 1. suspend it via evtchn > >> 2. modifty the return code to 1 > >> 3. the guest know that the suspend is cancelled, we will use fast path > >> to resume it. > >> > >> Under COLO, we will update the guest's state(modify memory, cpu's > >> registers, > >> device status...). In this case, we cannot use the fast path to resume it. > >> Keep the return code 0, and use a slow path to resume the guest. We have > >> updated the guest state, so we call it a new domain context. > >> > >> For HVM, the hypercall is a NOP. > > > > This doesn't match my reading of domain_resume on the Xen side, which is > > the ultimate effect of this hypercall. It seems to unpause the domain > > (and all vcpus) regardless of the domain type, including PVHVM vs HVM > > (which isn't something Xen is generally aware of anyway). > > > > I also can't really follow the stuff about PVHVM vs HVM vs uncooperative > > guests, and I certainly can't see where the PVHVM vs HVM distinction is > > made in this patch. > > Sorry for my mistake. I read the codes again: > > 1. suspend > a. PVHVM and PV: we use the same way to suspend the guest(send the suspend > request to the guest) > b. pure HVM: we call xc_domain_shutdown(..., SHUTDOWN_suspend) to suspend > the guest > c. ???: suspending the guest via XenBus control node AFAIK c is another option under a, it depends on whether the guest supports evtchn or not, if not then the xenstore variant will be used. > I don't know we will goto c in which case. > > 2. Resume: > a. fast path > In this case, we don't change the guest's state. > PV: modify the return code to 1, and than call the domctl: > XEN_DOMCTL_resumedomain > PVHVM: same with PV > HVM: do nothing in modify_returncode, and than call the domctl: > XEN_DOMCTL_resumedomain > b. slow > In this case, we have changed the guest's state. > PV: update start info, and reset all secondary CPU states. Than call the > domctl: XEN_DOMCTL_resumedomain > PVHVM and HVM can not be resumed. > > For PVHVM, in my test, only call the domctl: XEN_DOMCTL_resumedomain > can work. I am not sure if we should update start info and reset all > secondary CPU > states. > > For pure HVM guest, in my test, only call the domctl: XEN_DOMCTL_resumedomain > can > work. > > So we can call libxl__domain_resume(..., 1) if we don't change the guest > state, otherwise > call libxl__domain_resume(..., 0). > > Any suggestion is welcomed. > > Thanks > Wen Congyang > > > > > > Ian. > > > > > >> > >> Signed-off-by: Wen Congyang <wency@xxxxxxxxxxxxxx> > >> Signed-off-by: Yang Hongyang <yanghy@xxxxxxxxxxxxxx> > >> --- > >> tools/libxc/xc_resume.c | 22 ++++++++++++++++++---- > >> 1 file changed, 18 insertions(+), 4 deletions(-) > >> > >> diff --git a/tools/libxc/xc_resume.c b/tools/libxc/xc_resume.c > >> index e67bebd..bd82334 100644 > >> --- a/tools/libxc/xc_resume.c > >> +++ b/tools/libxc/xc_resume.c > >> @@ -109,6 +109,23 @@ static int xc_domain_resume_cooperative(xc_interface > >> *xch, uint32_t domid) > >> return do_domctl(xch, &domctl); > >> } > >> > >> +static int xc_domain_resume_hvm(xc_interface *xch, uint32_t domid) > >> +{ > >> + DECLARE_DOMCTL; > >> + > >> + /* > >> + * If it is PVHVM, the hypercall return code is 0, because this > >> + * is not a fast path resume, we do not modify_returncode as in > >> + * xc_domain_resume_cooperative. > >> + * (resuming it in a new domain context) > >> + * > >> + * If it is a HVM, the hypercall is a NOP. > >> + */ > >> + domctl.cmd = XEN_DOMCTL_resumedomain; > >> + domctl.domain = domid; > >> + return do_domctl(xch, &domctl); > >> +} > >> + > >> static int xc_domain_resume_any(xc_interface *xch, uint32_t domid) > >> { > >> DECLARE_DOMCTL; > >> @@ -138,10 +155,7 @@ static int xc_domain_resume_any(xc_interface *xch, > >> uint32_t domid) > >> */ > >> #if defined(__i386__) || defined(__x86_64__) > >> if ( info.hvm ) > >> - { > >> - ERROR("Cannot resume uncooperative HVM guests"); > >> - return rc; > >> - } > >> + return xc_domain_resume_hvm(xch, domid); > >> > >> if ( xc_domain_get_guest_width(xch, domid, &dinfo->guest_width) != 0 ) > >> { > > > > > > . > > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |