|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 4/4] x86: avoid double CR3 reload when switching to guest user mode
On 31/01/18 10:12, Jan Beulich wrote:
>
>>> --- a/xen/arch/x86/pv/domain.c
>>> +++ b/xen/arch/x86/pv/domain.c
>>> @@ -220,10 +220,20 @@ int pv_domain_initialise(struct domain *
>>> return rc;
>>> }
>>>
>>> -static void _toggle_guest_pt(struct vcpu *v)
>>> +static void _toggle_guest_pt(struct vcpu *v, bool force_cr3)
>>> {
>>> v->arch.flags ^= TF_kernel_mode;
>>> update_cr3(v);
>>> +
>>> + /*
>>> + * There's no need to load CR3 here when it is going to be loaded on
>>> the
>>> + * way out to guest mode again anyway, and when the page tables we're
>>> + * currently on are the kernel ones (whereas when switching to kernel
>>> + * mode we need to be able to write a bounce frame onto the kernel
>>> stack).
>>> + */
>>> + if ( !force_cr3 && !(v->arch.flags & TF_kernel_mode) )
>>> + return;
>>> +
>>> /* Don't flush user global mappings from the TLB. Don't tick TLB
>>> clock. */
>>> asm volatile ( "mov %0, %%cr3" : : "r" (v->arch.cr3) : "memory" );
>>>
>>> @@ -253,13 +263,13 @@ void toggle_guest_mode(struct vcpu *v)
>>> }
>>> asm volatile ( "swapgs" );
>>>
>>> - _toggle_guest_pt(v);
>>> + _toggle_guest_pt(v, cpu_has_no_xpti);
>>> }
>>>
>>> void toggle_guest_pt(struct vcpu *v)
>>> {
>>> if ( !is_pv_32bit_vcpu(v) )
>>> - _toggle_guest_pt(v);
>>> + _toggle_guest_pt(v, true);
>> This can be converted as well. The only callers are the LDT-fault and
>> I/O perm check, both when we are currently on user pagetables, needing
>> to switch to kernel briefly, then back to user.
> Converted to what?
_toggle_guest_pt(v, cpu_has_no_xpti);
> Those code paths certainly need CR3 to be
> written, or else the actual memory accesses will fail.
These are called in pairs, the first of which switches from user to the
kernel which pagetables, which fails your TF_kernel_mode fastpath
(because of the xor at the top), and the second call to move from the
kernel back to user, which can in principle use the same fastpath.
>
>> However, it would be better to drop the parameter and feed
>> cpu_has_no_xpti into the conditional above which explains why it is safe
>> to do.
> As a result, I also don't understand this part.
The force_cr3 parameter is unnecessary, at which point it would be far
clearer to explicitly check against cpu_has_no_xpti for the fastpath.
~Andrew
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |