On 9/11/18 3:54 AM, Jan Beulich wrote:
>>>> On 10.09.18 at 23:56, <boris.ostrov...@oracle.com> wrote:
>> On 09/10/2018 10:03 AM, Jan Beulich wrote:
>>> Having noticed that VMLOAD alone is about as fast as a single of the
>>> involved WRMSRs, I thought it might be a reasonable idea to also use it
>>> for PV. Measurements, however, have shown that an actual improvement can
>>> be achieved only with an early prefetch of the VMCB (thanks to Andrew
>>> for suggesting to try this), which I have to admit I can't really
>>> explain. This way on my Fam15 box context switch takes over 100 clocks
>>> less on average (the measured values are heavily varying in all cases,
>>> though).
>>>
>>> This is intentionally not using a new hvm_funcs hook: For one, this is
>>> all about PV, and something similar can hardly be done for VMX.
>>> Furthermore the indirect to direct call patching that is meant to be
>>> applied to most hvm_funcs hooks would be ugly to make work with
>>> functions having more than 6 parameters.
>>>
>>> Signed-off-by: Jan Beulich <jbeul...@suse.com>
>>> Acked-by: Brian Woods <brian.wo...@amd.com>
>>> ---
>>> v2: Re-base.
>>> ---
>>> Besides the mentioned oddity with measured performance, I've also
>>> noticed a significant difference (of at least 150 clocks) between
>>> measuring immediately around the calls to svm_load_segs() and measuring
>>> immediately inside the function.
>>>
>>
>>
>>>  
>>> +#ifdef CONFIG_PV
>>> +bool svm_load_segs(unsigned int ldt_ents, unsigned long ldt_base,
>>> +                   unsigned int fs_sel, unsigned long fs_base,
>>> +                   unsigned int gs_sel, unsigned long gs_base,
>>> +                   unsigned long gs_shadow)
>>> +{
>>> +    unsigned int cpu = smp_processor_id();
>>> +    struct vmcb_struct *vmcb = per_cpu(host_vmcb_va, cpu);
>>> +
>>> +    if ( unlikely(!vmcb) )
>>> +        return false;
>>> +
>>> +    if ( !ldt_base )
>>> +    {
>>> +        asm volatile ( "prefetch %0" :: "m" (vmcb->ldtr) );
>>> +        return true;
>>
>>
>> Could you explain why this is true? We haven't loaded FS/GS here.
> 
> A zero ldt_base argument indicates a prefetch request. This is an
> agreement between callers of the function and its implementation.


Oh, so this is what svm_load_segs(0, 0, 0, 0, 0, 0, 0) is for?

If yes then IMO a separate call would make things a bit clearer,
especially since the return value is ignored.


> 
>> I also couldn't find discussion about prefetch --- why is prefetching
>> ldtr expected to help?
> 
> See the patch description. ldtr as the element is a pretty random
> choice between the various fields VMLOAD touches. It's (presumably)
> more the page walk than the actual cache line(s) that we want to
> be pulled in ahead of time. I can only guess that VMLOAD execution
> is more "synchronous" wrt its memory accesses and/or latency to
> completion than other (simpler) instructions.

I think a code comment would be very helpful (including the fact that
ldtr is an arbitrary field), even if this is mentioned in the commit
message.

-boris

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to