All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] x86/vtsc: update vcpu_time in hvm_set_guest_time
@ 2013-06-04 12:49 Roger Pau Monne
  2013-06-04 13:09 ` George Dunlap
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Roger Pau Monne @ 2013-06-04 12:49 UTC (permalink / raw)
  To: xen-devel; +Cc: George Dunlap, Keir Fraser, Jan Beulich, Roger Pau Monne

When using a vtsc, hvm_set_guest_time changes hvm_vcpu.stime_offset,
which is used in the vcpu time structure to calculate the
tsc_timestamp, so after updating stime_offset we need to propagate the
change to vcpu_time in order for the guest to get the right time if
using the PV clock.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Cc: Keir Fraser <keir@xen.org>
Cc: Jan Beulich <jbeulich@suse.com>
Cc: George Dunlap <george.dunlap@eu.citrix.com>
---
Changes since v1:
 * Perform the call to update_vcpu_system_time in hvm_set_guest_time
   if the offset has changed and the vCPU is running.
---
 xen/arch/x86/hvm/vpt.c |   13 ++++++++++++-
 1 files changed, 12 insertions(+), 1 deletions(-)

diff --git a/xen/arch/x86/hvm/vpt.c b/xen/arch/x86/hvm/vpt.c
index 8dee662..d37d214 100644
--- a/xen/arch/x86/hvm/vpt.c
+++ b/xen/arch/x86/hvm/vpt.c
@@ -57,7 +57,18 @@ u64 hvm_get_guest_time(struct vcpu *v)
 
 void hvm_set_guest_time(struct vcpu *v, u64 guest_time)
 {
-    v->arch.hvm_vcpu.stime_offset += guest_time - hvm_get_guest_time(v);
+    u64 offset = guest_time - hvm_get_guest_time(v);
+
+    if ( offset ) {
+        v->arch.hvm_vcpu.stime_offset += offset;
+        /*
+         * If hvm_vcpu.stime_offset is updated make sure to
+         * also update vcpu time, since this value is used to
+         * calculate the TSC.
+         */
+        if ( v->is_running )
+            update_vcpu_system_time(v);
+    }
 }
 
 static int pt_irq_vector(struct periodic_time *pt, enum hvm_intsrc src)
-- 
1.7.7.5 (Apple Git-26)


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] x86/vtsc: update vcpu_time in hvm_set_guest_time
  2013-06-04 12:49 [PATCH v2] x86/vtsc: update vcpu_time in hvm_set_guest_time Roger Pau Monne
@ 2013-06-04 13:09 ` George Dunlap
  2013-06-04 13:59   ` Alex Bligh
  2013-06-04 13:47 ` Jan Beulich
  2013-06-04 15:25 ` George Dunlap
  2 siblings, 1 reply; 8+ messages in thread
From: George Dunlap @ 2013-06-04 13:09 UTC (permalink / raw)
  To: Roger Pau Monne
  Cc: Diana Crisan, Keir Fraser, Alex Bligh, Jan Beulich, xen-devel

On 06/04/2013 01:49 PM, Roger Pau Monne wrote:
> When using a vtsc, hvm_set_guest_time changes hvm_vcpu.stime_offset,
> which is used in the vcpu time structure to calculate the
> tsc_timestamp, so after updating stime_offset we need to propagate the
> change to vcpu_time in order for the guest to get the right time if
> using the PV clock.
>
> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
> Cc: Keir Fraser <keir@xen.org>
> Cc: Jan Beulich <jbeulich@suse.com>
> Cc: George Dunlap <george.dunlap@eu.citrix.com>

Reviewed-by: George Dunlap <george.dunlap@eu.citrix.com>

Diana / Alex, want to give this one a spin?

  -George


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] x86/vtsc: update vcpu_time in hvm_set_guest_time
  2013-06-04 12:49 [PATCH v2] x86/vtsc: update vcpu_time in hvm_set_guest_time Roger Pau Monne
  2013-06-04 13:09 ` George Dunlap
@ 2013-06-04 13:47 ` Jan Beulich
  2013-06-04 16:27   ` George Dunlap
  2013-06-04 15:25 ` George Dunlap
  2 siblings, 1 reply; 8+ messages in thread
From: Jan Beulich @ 2013-06-04 13:47 UTC (permalink / raw)
  To: Roger Pau Monne; +Cc: George Dunlap, Keir Fraser, xen-devel

>>> On 04.06.13 at 14:49, Roger Pau Monne <roger.pau@citrix.com> wrote:
> When using a vtsc, hvm_set_guest_time changes hvm_vcpu.stime_offset,
> which is used in the vcpu time structure to calculate the
> tsc_timestamp, so after updating stime_offset we need to propagate the
> change to vcpu_time in order for the guest to get the right time if
> using the PV clock.
> 
> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
> Cc: Keir Fraser <keir@xen.org>
> Cc: Jan Beulich <jbeulich@suse.com>
> Cc: George Dunlap <george.dunlap@eu.citrix.com>
> ---
> Changes since v1:
>  * Perform the call to update_vcpu_system_time in hvm_set_guest_time
>    if the offset has changed and the vCPU is running.
> ---
>  xen/arch/x86/hvm/vpt.c |   13 ++++++++++++-
>  1 files changed, 12 insertions(+), 1 deletions(-)
> 
> diff --git a/xen/arch/x86/hvm/vpt.c b/xen/arch/x86/hvm/vpt.c
> index 8dee662..d37d214 100644
> --- a/xen/arch/x86/hvm/vpt.c
> +++ b/xen/arch/x86/hvm/vpt.c
> @@ -57,7 +57,18 @@ u64 hvm_get_guest_time(struct vcpu *v)
>  
>  void hvm_set_guest_time(struct vcpu *v, u64 guest_time)
>  {
> -    v->arch.hvm_vcpu.stime_offset += guest_time - hvm_get_guest_time(v);
> +    u64 offset = guest_time - hvm_get_guest_time(v);
> +
> +    if ( offset ) {
> +        v->arch.hvm_vcpu.stime_offset += offset;
> +        /*
> +         * If hvm_vcpu.stime_offset is updated make sure to
> +         * also update vcpu time, since this value is used to
> +         * calculate the TSC.
> +         */
> +        if ( v->is_running )

I'm afraid this is at least a latent bug: "v->is_running" gets set
before "current" gets switched, and in the intermediate time
__hvm_copy() would copy to the wrong VM (or crash, if "current"
isn't a HVM vCPU).

> +            update_vcpu_system_time(v);
> +    }

Right now, both call paths

{svm,vmx}_intr_assist() -> pt_intr_post() -> hvm_set_guest_time()

and

{svm,vmx}_do_resume() -> hvm_do_resume() -> pt_restore_timer()
-> pt_thaw_time() -> hvm_set_guest_time()

appear to be safe, but it doesn't feel well to rely on this. I'd
therefore prefer to switch the condition above to "v == current"
or, considering that there are no other call paths (easier to prove
if hvm_set_guest_time() was made static, perhaps simply
ASSERT(v == current) before the call.

Jan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] x86/vtsc: update vcpu_time in hvm_set_guest_time
  2013-06-04 13:09 ` George Dunlap
@ 2013-06-04 13:59   ` Alex Bligh
  2013-06-04 16:38     ` Diana Crisan
  0 siblings, 1 reply; 8+ messages in thread
From: Alex Bligh @ 2013-06-04 13:59 UTC (permalink / raw)
  To: George Dunlap, Roger Pau Monne
  Cc: Diana Crisan, Keir Fraser, Alex Bligh, Jan Beulich, xen-devel



--On 4 June 2013 14:09:31 +0100 George Dunlap <george.dunlap@eu.citrix.com> 
wrote:

> On 06/04/2013 01:49 PM, Roger Pau Monne wrote:
>> When using a vtsc, hvm_set_guest_time changes hvm_vcpu.stime_offset,
>> which is used in the vcpu time structure to calculate the
>> tsc_timestamp, so after updating stime_offset we need to propagate the
>> change to vcpu_time in order for the guest to get the right time if
>> using the PV clock.
>>
>> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
>> Cc: Keir Fraser <keir@xen.org>
>> Cc: Jan Beulich <jbeulich@suse.com>
>> Cc: George Dunlap <george.dunlap@eu.citrix.com>
>
> Reviewed-by: George Dunlap <george.dunlap@eu.citrix.com>
>
> Diana / Alex, want to give this one a spin?

We will do. If it works we will test a 4.2.2 backport too.

-- 
Alex Bligh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] x86/vtsc: update vcpu_time in hvm_set_guest_time
  2013-06-04 12:49 [PATCH v2] x86/vtsc: update vcpu_time in hvm_set_guest_time Roger Pau Monne
  2013-06-04 13:09 ` George Dunlap
  2013-06-04 13:47 ` Jan Beulich
@ 2013-06-04 15:25 ` George Dunlap
  2 siblings, 0 replies; 8+ messages in thread
From: George Dunlap @ 2013-06-04 15:25 UTC (permalink / raw)
  To: Roger Pau Monne; +Cc: Keir Fraser, Jan Beulich, xen-devel@lists.xen.org

On Tue, Jun 4, 2013 at 1:49 PM, Roger Pau Monne <roger.pau@citrix.com> wrote:
> When using a vtsc, hvm_set_guest_time changes hvm_vcpu.stime_offset,
> which is used in the vcpu time structure to calculate the
> tsc_timestamp, so after updating stime_offset we need to propagate the
> change to vcpu_time in order for the guest to get the right time if
> using the PV clock.

Just for public record:

I looked into the other elements that go into the system_time update
calculation, to make sure we weren't missing anything else that might
need updating.  They are:
 1. d->arch.hvm_domain.pl_time.stime_offset
 2. d->arch.vtsc_offset (if the VM is not an hvm_domain)
 3. d->arch.ns_to_vtsc

#1 is set once in xen/arch/x86/hvm/vpt.c:hvm_init_guest_time() and
never touched again.

#2 and #3 are set in xen/arch/x86/time.c:tsc_set_info, with a comment
saying that the info needs to be set and stabilized before the first
guest RDTSC; so they *should* never be updated while the guest is
running.  It  might be nice to have a check to make sure of that, but
it's just a bit more work than I feel like doing at the moment
(probably checking all the individual vcpus in a domain).

 -George

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] x86/vtsc: update vcpu_time in hvm_set_guest_time
  2013-06-04 13:47 ` Jan Beulich
@ 2013-06-04 16:27   ` George Dunlap
  2013-06-04 16:33     ` Jan Beulich
  0 siblings, 1 reply; 8+ messages in thread
From: George Dunlap @ 2013-06-04 16:27 UTC (permalink / raw)
  To: Jan Beulich; +Cc: xen-devel@lists.xen.org, Keir Fraser, Roger Pau Monne

On Tue, Jun 4, 2013 at 2:47 PM, Jan Beulich <JBeulich@suse.com> wrote:
>>>> On 04.06.13 at 14:49, Roger Pau Monne <roger.pau@citrix.com> wrote:
>> When using a vtsc, hvm_set_guest_time changes hvm_vcpu.stime_offset,
>> which is used in the vcpu time structure to calculate the
>> tsc_timestamp, so after updating stime_offset we need to propagate the
>> change to vcpu_time in order for the guest to get the right time if
>> using the PV clock.
>>
>> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
>> Cc: Keir Fraser <keir@xen.org>
>> Cc: Jan Beulich <jbeulich@suse.com>
>> Cc: George Dunlap <george.dunlap@eu.citrix.com>
>> ---
>> Changes since v1:
>>  * Perform the call to update_vcpu_system_time in hvm_set_guest_time
>>    if the offset has changed and the vCPU is running.
>> ---
>>  xen/arch/x86/hvm/vpt.c |   13 ++++++++++++-
>>  1 files changed, 12 insertions(+), 1 deletions(-)
>>
>> diff --git a/xen/arch/x86/hvm/vpt.c b/xen/arch/x86/hvm/vpt.c
>> index 8dee662..d37d214 100644
>> --- a/xen/arch/x86/hvm/vpt.c
>> +++ b/xen/arch/x86/hvm/vpt.c
>> @@ -57,7 +57,18 @@ u64 hvm_get_guest_time(struct vcpu *v)
>>
>>  void hvm_set_guest_time(struct vcpu *v, u64 guest_time)
>>  {
>> -    v->arch.hvm_vcpu.stime_offset += guest_time - hvm_get_guest_time(v);
>> +    u64 offset = guest_time - hvm_get_guest_time(v);
>> +
>> +    if ( offset ) {
>> +        v->arch.hvm_vcpu.stime_offset += offset;
>> +        /*
>> +         * If hvm_vcpu.stime_offset is updated make sure to
>> +         * also update vcpu time, since this value is used to
>> +         * calculate the TSC.
>> +         */
>> +        if ( v->is_running )
>
> I'm afraid this is at least a latent bug: "v->is_running" gets set
> before "current" gets switched, and in the intermediate time
> __hvm_copy() would copy to the wrong VM (or crash, if "current"
> isn't a HVM vCPU).

Good catch.

Should we add an ASSERT() to update_vcpu_system_time() that "v == current"?

 -George

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] x86/vtsc: update vcpu_time in hvm_set_guest_time
  2013-06-04 16:27   ` George Dunlap
@ 2013-06-04 16:33     ` Jan Beulich
  0 siblings, 0 replies; 8+ messages in thread
From: Jan Beulich @ 2013-06-04 16:33 UTC (permalink / raw)
  To: George Dunlap; +Cc: xen-devel@lists.xen.org, Keir Fraser, Roger Pau Monne

>>> On 04.06.13 at 18:27, George Dunlap <George.Dunlap@eu.citrix.com> wrote:
> On Tue, Jun 4, 2013 at 2:47 PM, Jan Beulich <JBeulich@suse.com> wrote:
>>>>> On 04.06.13 at 14:49, Roger Pau Monne <roger.pau@citrix.com> wrote:
>>> When using a vtsc, hvm_set_guest_time changes hvm_vcpu.stime_offset,
>>> which is used in the vcpu time structure to calculate the
>>> tsc_timestamp, so after updating stime_offset we need to propagate the
>>> change to vcpu_time in order for the guest to get the right time if
>>> using the PV clock.
>>>
>>> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
>>> Cc: Keir Fraser <keir@xen.org>
>>> Cc: Jan Beulich <jbeulich@suse.com>
>>> Cc: George Dunlap <george.dunlap@eu.citrix.com>
>>> ---
>>> Changes since v1:
>>>  * Perform the call to update_vcpu_system_time in hvm_set_guest_time
>>>    if the offset has changed and the vCPU is running.
>>> ---
>>>  xen/arch/x86/hvm/vpt.c |   13 ++++++++++++-
>>>  1 files changed, 12 insertions(+), 1 deletions(-)
>>>
>>> diff --git a/xen/arch/x86/hvm/vpt.c b/xen/arch/x86/hvm/vpt.c
>>> index 8dee662..d37d214 100644
>>> --- a/xen/arch/x86/hvm/vpt.c
>>> +++ b/xen/arch/x86/hvm/vpt.c
>>> @@ -57,7 +57,18 @@ u64 hvm_get_guest_time(struct vcpu *v)
>>>
>>>  void hvm_set_guest_time(struct vcpu *v, u64 guest_time)
>>>  {
>>> -    v->arch.hvm_vcpu.stime_offset += guest_time - hvm_get_guest_time(v);
>>> +    u64 offset = guest_time - hvm_get_guest_time(v);
>>> +
>>> +    if ( offset ) {
>>> +        v->arch.hvm_vcpu.stime_offset += offset;
>>> +        /*
>>> +         * If hvm_vcpu.stime_offset is updated make sure to
>>> +         * also update vcpu time, since this value is used to
>>> +         * calculate the TSC.
>>> +         */
>>> +        if ( v->is_running )
>>
>> I'm afraid this is at least a latent bug: "v->is_running" gets set
>> before "current" gets switched, and in the intermediate time
>> __hvm_copy() would copy to the wrong VM (or crash, if "current"
>> isn't a HVM vCPU).
> 
> Good catch.
> 
> Should we add an ASSERT() to update_vcpu_system_time() that "v == current"?

Yes, probably, now that we have a caller of it that wasn't at the
first glance obviously meeting that requirement.

Jan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] x86/vtsc: update vcpu_time in hvm_set_guest_time
  2013-06-04 13:59   ` Alex Bligh
@ 2013-06-04 16:38     ` Diana Crisan
  0 siblings, 0 replies; 8+ messages in thread
From: Diana Crisan @ 2013-06-04 16:38 UTC (permalink / raw)
  To: Alex Bligh
  Cc: George Dunlap, xen-devel, Keir Fraser, Jan Beulich,
	Roger Pau Monne

On 04/06/13 14:59, Alex Bligh wrote:
>
>
> --On 4 June 2013 14:09:31 +0100 George Dunlap 
> <george.dunlap@eu.citrix.com> wrote:
>
>> On 06/04/2013 01:49 PM, Roger Pau Monne wrote:
>>> When using a vtsc, hvm_set_guest_time changes hvm_vcpu.stime_offset,
>>> which is used in the vcpu time structure to calculate the
>>> tsc_timestamp, so after updating stime_offset we need to propagate the
>>> change to vcpu_time in order for the guest to get the right time if
>>> using the PV clock.
>>>
>>> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
>>> Cc: Keir Fraser <keir@xen.org>
>>> Cc: Jan Beulich <jbeulich@suse.com>
>>> Cc: George Dunlap <george.dunlap@eu.citrix.com>
>>
>> Reviewed-by: George Dunlap <george.dunlap@eu.citrix.com>
>>
>> Diana / Alex, want to give this one a spin?
>
> We will do. If it works we will test a 4.2.2 backport too.
>
I have tested patch-v2 with xen4.3 and it did not get a clock stuck yet 
across mutiple migrations between hosts (i.e. not localhost). I have 
patched in v3 and will do some further stress testing tomorrow. Once it 
works I will also test a backport to 4.2.2 and also give an update.

Thanks,
Diana


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2013-06-04 16:38 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-06-04 12:49 [PATCH v2] x86/vtsc: update vcpu_time in hvm_set_guest_time Roger Pau Monne
2013-06-04 13:09 ` George Dunlap
2013-06-04 13:59   ` Alex Bligh
2013-06-04 16:38     ` Diana Crisan
2013-06-04 13:47 ` Jan Beulich
2013-06-04 16:27   ` George Dunlap
2013-06-04 16:33     ` Jan Beulich
2013-06-04 15:25 ` George Dunlap

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.