[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-devel] RE: Saving/Restoring IA32_TSC_AUX MSR



Dan, 
        Thanks for reply, some comments below. 

Best Regards,
-- Dongxiao

Dan Magenheimer wrote:
> Hi Dongxiao --
> 
> There are two approaches to adding rdtscp support:
> 
> 1) Faithful full implementation of rdtscp instruction
> 2) Support pvrtdtscp algorithm
> 
> For (1), you would enable the rdtscp bit in cpuid.  Then
> on hardware that supports rdtscp, you would do context
> switching of TSC_AUX.  On hardware that doesn't support
> rdtscp, you would intercept the illegal instruction trap
> and emulate the instruction.  (TSC_AUX emulation
> could be handled "lazily", no need to do context
> switch for that.)
> 
> BUT if you look at how TSC_AUX is used by a native
> OS**, the OS sets TSC_AUX to each physical CPU number
> so an application can easily determine if successive
> rdtscp instructions were not executed on the same
> processor.  (This was important on older processors
> that did not have invariant TSC.)  Unfortunately,
> on Xen, this mechanism is worthless and misleading
> because the OS believes it is setting TSC_AUX to
> a physical CPU number but it is actually setting
> it to a virtual CPU number, and the physical CPU
> number may change at any time due to scheduling
> or migration.  So an app using rdtscp will get a
> wrong answer.

However for HVM, we should keep its behavior the same as
on native machine. So if hardware support rdtscp, we will also
support it in HVM; if not, we will not expose that bit in cpuid 
to guest. 

> 
> As a result, I do NOT recommend (1) and do recommend
> that Xen should continue to return zero for the rdtscp
> bit in cpuid.
> 
> For (2), setting TSC_AUX in __update_vcpu_system_time()
> is fine (I think).  On hardware that supports, for HVM
> you would need to ensure that the rdtscp instruction
> works natively (even though the rdtscp bit in cpuid
> is not turned on for the guest).  On hardware that
> does not support rdtscp, you would intercept the illegal
> instruction trap and call the existing code in
> pv_soft_rdtsc().

Put the writing of TSC_AUX MSR in __update_vcpu_system_time()
has a problem that, Hypervisor will overwrite the value time to time,
( For example, at do_softirq()->local_time_calibration() ), even if the
value didn't change (Currently the domain incarnation value only
increase at save/restore/migration). This makes HVM support a bit
Tricky because we need to save/restore guest/host TSC_AUX at every
VMEXIT/VMENTRY. If both PV/HVM could put TSC_AUX writing in 
context_switch(), then things will become easier for HVM support. 
Do you have idea about It? Thanks!  :-)

> 
> Does that make sense?
> 
> Thanks,
> Dan
> 
> ** I've looked at RHEL5.  Windows actually always
> returns 0 for TSC_AUX.
> 
>> -----Original Message-----
>> From: Xu, Dongxiao [mailto:dongxiao.xu@xxxxxxxxx]
>> Sent: Thursday, December 10, 2009 4:22 AM
>> To: Dan Magenheimer; Nakajima, Jun;
>> xen-devel@xxxxxxxxxxxxxxxxxxx; Keir
>> Fraser
>> Subject: RE: [Xen-devel] RE: Saving/Restoring IA32_TSC_AUX MSR
>> 
>> 
>> Hi, Dan,
>>      I am now trying to add the rdtscp support for Xen HVM guest.
>>      I have some questions about your pvrdtscp patch. See below.
>> 
>> Dan Magenheimer wrote:
>>> Hi Jun --
>>> 
>>>> But it's possible that multiple domains use the pvrdtscp
>>>> algorithm, and the incarnation number is domain specific.
>>> 
>>> OK, I see.  The code for writing TSC_AUX is in
>>> __update_vcpu_system_time() not in context switch.
>> 
>> Will you modify the place where Hypervisor writes TSC_AUX MSR?
>> In the current pvrdtscp logic, I think this MSR should be
>> written while
>> vcpu context switch. Also, this will make HVM support much easier
>> because that MSR would not be modified by Hypervisor time to time.
>> 
>>> 
>>>> We also have the issue when adding RDTSCP support for
>>>> HVM guests.
>>> 
>>> Only if you expose the rdtscp bit via cpuid.  This could
>>> certainly be done but, as I said, is probably pointless.
>>> (The pvrdtscp algorithm uses the instruction whether or
>>> not the rdtscp bit is set in cpuid, since Xen emulates
>>> it -- for PV domains only now -- if the physical machine
>>> doesn't support the instruction.
>> 
>> We are planning to add HVM support for RDTSCP, and the
>> behavior for this instruction
>> will follow the native way.
>> This caused a problem that RDTSCP instruction in application
>> has different experience
>> upon PV and HVM domains. Do you have any comment about this? Thanks!
>> 
>> Thanks!
>> Dongxiao
>> 
>>> 
>>> Dan
>>> 
>>>> -----Original Message-----
>>>> From: Nakajima, Jun [mailto:jun.nakajima@xxxxxxxxx]
>>>> Sent: Wednesday, December 09, 2009 10:08 AM
>>>> To: Dan Magenheimer; xen-devel@xxxxxxxxxxxxxxxxxxx
>>>> Subject: RE: Saving/Restoring IA32_TSC_AUX MSR
>>>> 
>>>> 
>>>> Dan Magenheimer wrote on Wed, 9 Dec 2009 at 08:59:59:
>>>> 
>>>>> Hi Jun --
>>>>> 
>>>> 
>>>> Dan,
>>>> 
>>>>> Xen doesn't expose the TSC rdtscp bit so assumes that
>>>>> no guests depend on it.  So no save/restore of TSC_AUX
>>>>> is necessary.  Xen could provide support for the TSC
>>>> 
>>>> But it's possible that multiple domains use the pvrdtscp
>>>> algorithm, and the incarnation number is domain specific. We
>>>> also have the issue when adding RDTSCP support for HVM guests.
>>>> 
>>>>> rdtscp bit and allow a guest OS to manage TSC_AUX, but
>>>>> the existing use of TSC_AUX by Linux would fail to
>>>>> provide the desired result across migration, so there's
>>>>> little point.  Also the pvrdtscp algorithm now assumes
>>>>> that Xen itself is responsible for updating TSC_AUX
>>>>> whenever a migration (across physical machines) occurs.
>>>>> 
>>>>> The #define for write_rdtscp_aux is from Linux source,
>>>>> so I didn't change the code and define the constant.
>>>>> 
>>>>> Dan
>>>>> 
>>>>>> -----Original Message-----
>>>>>> From: Nakajima, Jun [mailto:jun.nakajima@xxxxxxxxx]
>>>>>> Sent: Wednesday, December 09, 2009 9:42 AM
>>>>>> To: xen-devel@xxxxxxxxxxxxxxxxxxx
>>>>>> Cc: Dan Magenheimer
>>>>>> Subject: Saving/Restoring IA32_TSC_AUX MSR
>>>>>> 
>>>>>> 
>>>>>> I see the code like (in arch/x86/time.c), and wondering how
>>>>>> IA32_TSC_AUX MSR is saved/restored at domain switch time.
>>>>>> 
>>>>>>     if ( (d->arch.tsc_mode ==  TSC_MODE_PVRDTSCP) &&
>>>>>>          boot_cpu_has(X86_FEATURE_RDTSCP) )
>>>>>>         write_rdtscp_aux(d->arch.incarnation);
>>>>>> 
>>>>>> BTW,
>>>>>> 
>>>>>> include/asm-x86/msr.h
>>>>>> #define write_rdtscp_aux(val) wrmsr(0xc0000103, (val), 0)
>>>>>> 
>>>>>> We should write like wrmsr(MSR_TSC_AUX, (val), 0) by adding
>>>>>> +#define MSR_TSC_AUX             0xc0000103 /* Auxiliary TSC */
>>>>>> in include/asm-x86/msr-index.h
>>>>>> 
>>>>>> Thanks,
>>>>>> Jun
>>>>>> ---
>>>>>> Intel Open Source Technology Center
>>>>>> 
>>>>>> 
>>>> 
>>>> Jun
>>>> ___
>>>> Intel Open Source Technology Center
>>>> 
>>>> 
>>>> 
>>>> 
>>> 
>>> _______________________________________________
>>> Xen-devel mailing list
>>> Xen-devel@xxxxxxxxxxxxxxxxxxx
>>> http://lists.xensource.com/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.