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

Re: [Xen-devel] [PATCH v3] x86: use VMLOAD for PV context switch



>>> On 26.09.18 at 14:47, <andrew.cooper3@xxxxxxxxxx> wrote:
> On 26/09/18 07:33, Jan Beulich wrote:
>>>>> On 25.09.18 at 18:14, <andrew.cooper3@xxxxxxxxxx> wrote:
>>> On 18/09/18 13:28, Jan Beulich wrote:
>>>> @@ -1281,11 +1282,35 @@ static void load_segments(struct vcpu *n
>>>>      struct cpu_user_regs *uregs = &n->arch.user_regs;
>>>>      int all_segs_okay = 1;
>>>>      unsigned int dirty_segment_mask, cpu = smp_processor_id();
>>>> +    bool fs_gs_done = false;
>>>>  
>>>>      /* Load and clear the dirty segment mask. */
>>>>      dirty_segment_mask = per_cpu(dirty_segment_mask, cpu);
>>>>      per_cpu(dirty_segment_mask, cpu) = 0;
>>>>  
>>>> +#ifdef CONFIG_HVM
>>>> +    if ( !is_pv_32bit_vcpu(n) && !cpu_has_fsgsbase && cpu_has_svm &&
>>>> +         !((uregs->fs | uregs->gs) & ~3) &&
>>>> +         /*
>>>> +          * The remaining part is just for optimization: If only shadow GS
>>>> +          * needs loading, there's nothing to be gained here.
>>> VMLOAD also loads LDT, and LLDT is fully serialising, so an even heavier
>>> perf hit than wrmsr.
>> I don't understand how your remark relates to the comment
> 
> Because the comment is false in the case that the LDT also needs loading.

True (and the comment is a result of me having written it before paying
attention to the fact that the LDT can also be loaded this way); I'll OR
n->arch.pv.ldt_ents into that extra (optimization) condition, which
I think will then render the comment correct again.

>>>> +
>>>> +    if ( !ldt_base )
>>>> +    {
>>>> +        /*
>>>> +         * The actual structure field used here was arbitrarily chosen.
>>>> +         * Empirically it doesn't seem to matter much which element is 
>>>> used,
>>>> +         * and a clear explanation of the otherwise poor performance has 
>>>> not
>>>> +         * been found/provided so far.
>>>> +         */
>>>> +        asm volatile ( "prefetch %0" :: "m" (vmcb->ldtr) );
>>> prefetchw(), which already exists and is used.
>> I've specifically decided against using it, as we don't mean to write any
>> part of the VMCB.
> 
> I think you need to double check your reasoning here.  There is a reason
> why this function wont compile if you made vmcb a const pointer.

Oh, right you are. It's been way too long since I wrote this code,
and hence I should have looked back at it before replying rather
than just going from the function's name.

Jan



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

 


Rackspace

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