diff mbox

[Xen-devel] clarify SHUTDOWN_suspend additional argument

Message ID alpine.DEB.2.02.1405071402550.14596@kaball.uk.xensource.com
State New
Headers show

Commit Message

Stefano Stabellini May 7, 2014, 1:05 p.m. UTC
SCHEDOP_shutdown has a third argument that is unused on HVM and ARM
guests. Those guests pass 0 instead. Clarify the behaviour in the
hypercall description.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Comments

Ian Campbell May 8, 2014, 10:11 a.m. UTC | #1
On Wed, 2014-05-07 at 14:05 +0100, Stefano Stabellini wrote:
> SCHEDOP_shutdown has a third argument that is unused on HVM and ARM
> guests. Those guests pass 0 instead. Clarify the behaviour in the
> hypercall description.
> 
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Acked-by: Ian Campbell <ian.campbell@citrix.com>

But:
> diff --git a/xen/include/public/sched.h b/xen/include/public/sched.h
> index a30b11d..c170556 100644
> --- a/xen/include/public/sched.h
> +++ b/xen/include/public/sched.h
> @@ -77,8 +77,9 @@
>   * @arg == pointer to sched_shutdown_t structure.
>   *
>   * If the sched_shutdown_t reason is SHUTDOWN_suspend then this
> - * hypercall takes an additional extra argument which should be the
> - * MFN of the guest's start_info_t.
> + * hypercall takes an additional extra argument which should be:
> + *  - the MFN of the guest's start_info_t for x86 PV guests;
> + *  - 0 for x86 HVM guests and arm and arm64 guests.

Is this strictly true or is the argument ignored for those guests?
(Requiring it to be zero doesn't conflict with that hence the ack)

>   *
>   * In addition, which reason is SHUTDOWN_suspend this hypercall
>   * returns 1 if suspend was cancelled or the domain was merely
Andrew Cooper May 8, 2014, 10:21 a.m. UTC | #2
On 08/05/14 11:11, Ian Campbell wrote:
> On Wed, 2014-05-07 at 14:05 +0100, Stefano Stabellini wrote:
>> SCHEDOP_shutdown has a third argument that is unused on HVM and ARM
>> guests. Those guests pass 0 instead. Clarify the behaviour in the
>> hypercall description.
>>
>> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> Acked-by: Ian Campbell <ian.campbell@citrix.com>
>
> But:
>> diff --git a/xen/include/public/sched.h b/xen/include/public/sched.h
>> index a30b11d..c170556 100644
>> --- a/xen/include/public/sched.h
>> +++ b/xen/include/public/sched.h
>> @@ -77,8 +77,9 @@
>>   * @arg == pointer to sched_shutdown_t structure.
>>   *
>>   * If the sched_shutdown_t reason is SHUTDOWN_suspend then this
>> - * hypercall takes an additional extra argument which should be the
>> - * MFN of the guest's start_info_t.
>> + * hypercall takes an additional extra argument which should be:
>> + *  - the MFN of the guest's start_info_t for x86 PV guests;
>> + *  - 0 for x86 HVM guests and arm and arm64 guests.
> Is this strictly true or is the argument ignored for those guests?
> (Requiring it to be zero doesn't conflict with that hence the ack)

Having recently played with code here, I believe it is as follows.

* Xen does absolutely nothing with the value whatsoever.
* PV Migration *must* check the value (and indeed converts it to a pfn
for transit)
* HVM guests (including arm for these purposes) don't have easy access
to the register, and just transmit the Xen architectural state blob as-is.

Therefore, the only requirement I can see is that PV guests must point
it at the start_info_t mfn.

~Andrew

>
>>   *
>>   * In addition, which reason is SHUTDOWN_suspend this hypercall
>>   * returns 1 if suspend was cancelled or the domain was merely
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel
Ian Campbell May 8, 2014, 10:40 a.m. UTC | #3
On Thu, 2014-05-08 at 11:21 +0100, Andrew Cooper wrote:
> On 08/05/14 11:11, Ian Campbell wrote:
> > On Wed, 2014-05-07 at 14:05 +0100, Stefano Stabellini wrote:
> >> SCHEDOP_shutdown has a third argument that is unused on HVM and ARM
> >> guests. Those guests pass 0 instead. Clarify the behaviour in the
> >> hypercall description.
> >>
> >> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > Acked-by: Ian Campbell <ian.campbell@citrix.com>
> >
> > But:
> >> diff --git a/xen/include/public/sched.h b/xen/include/public/sched.h
> >> index a30b11d..c170556 100644
> >> --- a/xen/include/public/sched.h
> >> +++ b/xen/include/public/sched.h
> >> @@ -77,8 +77,9 @@
> >>   * @arg == pointer to sched_shutdown_t structure.
> >>   *
> >>   * If the sched_shutdown_t reason is SHUTDOWN_suspend then this
> >> - * hypercall takes an additional extra argument which should be the
> >> - * MFN of the guest's start_info_t.
> >> + * hypercall takes an additional extra argument which should be:
> >> + *  - the MFN of the guest's start_info_t for x86 PV guests;
> >> + *  - 0 for x86 HVM guests and arm and arm64 guests.
> > Is this strictly true or is the argument ignored for those guests?
> > (Requiring it to be zero doesn't conflict with that hence the ack)
> 
> Having recently played with code here, I believe it is as follows.
> 
> * Xen does absolutely nothing with the value whatsoever.
> * PV Migration *must* check the value (and indeed converts it to a pfn
> for transit)
> * HVM guests (including arm for these purposes) don't have easy access
> to the register, and just transmit the Xen architectural state blob as-is.
> 
> Therefore, the only requirement I can see is that PV guests must point
> it at the start_info_t mfn.

This matched my understanding too, thanks for confirming.

There's no harm in mandating it be zero I suppose, except perhaps we've
just made some OSes undetectably buggy, which would only be a problem if
in the future someone decided "oh, this must be 0, so we can now extend
the interface safely".

Ian.
David Vrabel May 8, 2014, 10:46 a.m. UTC | #4
On 07/05/14 14:05, Stefano Stabellini wrote:
> SCHEDOP_shutdown has a third argument that is unused on HVM and ARM
> guests. Those guests pass 0 instead. Clarify the behaviour in the
> hypercall description.
> 
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> 
> diff --git a/xen/include/public/sched.h b/xen/include/public/sched.h
> index a30b11d..c170556 100644
> --- a/xen/include/public/sched.h
> +++ b/xen/include/public/sched.h
> @@ -77,8 +77,9 @@
>   * @arg == pointer to sched_shutdown_t structure.
>   *
>   * If the sched_shutdown_t reason is SHUTDOWN_suspend then this
> - * hypercall takes an additional extra argument which should be the
> - * MFN of the guest's start_info_t.
> + * hypercall takes an additional extra argument which should be:
> + *  - the MFN of the guest's start_info_t for x86 PV guests;
> + *  - 0 for x86 HVM guests and arm and arm64 guests.

Perhaps word this to reflect what the toolstack actually does?

* x86 PV guest must also set RDX (EDX for 32-bit guests) to the MFN
* of the guest's start info page.  RDX/EDX is the third hypercall
* argument.

David
Andrew Cooper May 8, 2014, 10:47 a.m. UTC | #5
On 08/05/14 11:40, Ian Campbell wrote:
> On Thu, 2014-05-08 at 11:21 +0100, Andrew Cooper wrote:
>> On 08/05/14 11:11, Ian Campbell wrote:
>>> On Wed, 2014-05-07 at 14:05 +0100, Stefano Stabellini wrote:
>>>> SCHEDOP_shutdown has a third argument that is unused on HVM and ARM
>>>> guests. Those guests pass 0 instead. Clarify the behaviour in the
>>>> hypercall description.
>>>>
>>>> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>>> Acked-by: Ian Campbell <ian.campbell@citrix.com>
>>>
>>> But:
>>>> diff --git a/xen/include/public/sched.h b/xen/include/public/sched.h
>>>> index a30b11d..c170556 100644
>>>> --- a/xen/include/public/sched.h
>>>> +++ b/xen/include/public/sched.h
>>>> @@ -77,8 +77,9 @@
>>>>   * @arg == pointer to sched_shutdown_t structure.
>>>>   *
>>>>   * If the sched_shutdown_t reason is SHUTDOWN_suspend then this
>>>> - * hypercall takes an additional extra argument which should be the
>>>> - * MFN of the guest's start_info_t.
>>>> + * hypercall takes an additional extra argument which should be:
>>>> + *  - the MFN of the guest's start_info_t for x86 PV guests;
>>>> + *  - 0 for x86 HVM guests and arm and arm64 guests.
>>> Is this strictly true or is the argument ignored for those guests?
>>> (Requiring it to be zero doesn't conflict with that hence the ack)
>> Having recently played with code here, I believe it is as follows.
>>
>> * Xen does absolutely nothing with the value whatsoever.
>> * PV Migration *must* check the value (and indeed converts it to a pfn
>> for transit)
>> * HVM guests (including arm for these purposes) don't have easy access
>> to the register, and just transmit the Xen architectural state blob as-is.
>>
>> Therefore, the only requirement I can see is that PV guests must point
>> it at the start_info_t mfn.
> This matched my understanding too, thanks for confirming.
>
> There's no harm in mandating it be zero I suppose, except perhaps we've
> just made some OSes undetectably buggy, which would only be a problem if
> in the future someone decided "oh, this must be 0, so we can now extend
> the interface safely".
>
> Ian.
>

Yes - retroactively mandating it to be 0 will 'break' current HVM
guests, which will have whatever value was in %rdx.  For a very long
time this hypercall was mis-documented as a 2-argument hypercall, making
it more likely that something non-0 was in there.

The best that can be safely stated in the comment is that the 3rd
parameter is free for VM use for x86 HVM and ARM guests.  (Unless I
suppose ARM want to restrict this before migration is supported?)

~Andrew
Stefano Stabellini May 8, 2014, 3:39 p.m. UTC | #6
On Thu, 8 May 2014, David Vrabel wrote:
> On 07/05/14 14:05, Stefano Stabellini wrote:
> > SCHEDOP_shutdown has a third argument that is unused on HVM and ARM
> > guests. Those guests pass 0 instead. Clarify the behaviour in the
> > hypercall description.
> > 
> > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > 
> > diff --git a/xen/include/public/sched.h b/xen/include/public/sched.h
> > index a30b11d..c170556 100644
> > --- a/xen/include/public/sched.h
> > +++ b/xen/include/public/sched.h
> > @@ -77,8 +77,9 @@
> >   * @arg == pointer to sched_shutdown_t structure.
> >   *
> >   * If the sched_shutdown_t reason is SHUTDOWN_suspend then this
> > - * hypercall takes an additional extra argument which should be the
> > - * MFN of the guest's start_info_t.
> > + * hypercall takes an additional extra argument which should be:
> > + *  - the MFN of the guest's start_info_t for x86 PV guests;
> > + *  - 0 for x86 HVM guests and arm and arm64 guests.
> 
> Perhaps word this to reflect what the toolstack actually does?
> 
> * x86 PV guest must also set RDX (EDX for 32-bit guests) to the MFN
> * of the guest's start info page.  RDX/EDX is the third hypercall
> * argument.
 
That is better. It also the advantage on keeping the sched_op hypercall
always to 2 arguments on ARM, making the Linux side implementation
cleaner.
I'll respin both this patch and the corresponding Linux side.
diff mbox

Patch

diff --git a/xen/include/public/sched.h b/xen/include/public/sched.h
index a30b11d..c170556 100644
--- a/xen/include/public/sched.h
+++ b/xen/include/public/sched.h
@@ -77,8 +77,9 @@ 
  * @arg == pointer to sched_shutdown_t structure.
  *
  * If the sched_shutdown_t reason is SHUTDOWN_suspend then this
- * hypercall takes an additional extra argument which should be the
- * MFN of the guest's start_info_t.
+ * hypercall takes an additional extra argument which should be:
+ *  - the MFN of the guest's start_info_t for x86 PV guests;
+ *  - 0 for x86 HVM guests and arm and arm64 guests.
  *
  * In addition, which reason is SHUTDOWN_suspend this hypercall
  * returns 1 if suspend was cancelled or the domain was merely