|
[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 06/11/2015 04:44 PM, Ian Campbell wrote:
> 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 remember it now. IIRC, the behavior in the guest are the same. Is it right?
Thanks
Wen Congyang
>
>> 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 |