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

Re: [Xen-devel] [PATCH] x86/EFI: further correct FPU state handling around runtime calls

>>> On 22.06.18 at 04:18, <andrew.cooper3@xxxxxxxxxx> wrote:
> On 21/06/18 19:53, Jan Beulich wrote:
>> We must not leave a vCPU with CR0.TS clear when it is not in fully eager
>> mode and has not touched non-lazy state. Instead of adding a 3rd
>> invocation of stts() to vcpu_restore_fpu_eager(), consolidate all of
>> them into a single one done at the end of the function.
>> The new function parameter is not really well named, but
>> "need_stts_if_not_fully_eager" seemed excessive to me. Suggestions
>> welcome.
> I think "maybe_stts" is reasonable here.  At least it is accurate.

I had considered  this name, and discarded it as specifically not
accurate: The call site in efi_rs_leave() absolutely wants the stts()
in not-fully-eager mode.

> OTOH, as we're changing all callsites, can we please rename the function
> to vcpu_restore_fpu_nonlazy() to match the rest of the terminology, and
> avoid this function looking like it restores all state.

Indeed, I could (and hence should) do this.

>> --- a/xen/arch/x86/i387.c
>> +++ b/xen/arch/x86/i387.c
>> @@ -206,11 +206,11 @@ static inline void fpu_fxsave(struct vcp
>>  /*       VCPU FPU Functions    */
>>  /*******************************/
>>  /* Restore FPU state whenever VCPU is schduled in. */
>> -void vcpu_restore_fpu_eager(struct vcpu *v)
>> +void vcpu_restore_fpu_eager(struct vcpu *v, bool need_stts)
>>  {
>>      /* Restore nonlazy extended state (i.e. parts not tracked by CR0.TS). 
> */
>>      if ( !v->arch.fully_eager_fpu && !v->arch.nonlazy_xstate_used )
>> -        return;
>> +        goto maybe_stts;
> This surely needs to be is_pv_vcpu(v) && (v->arch.pv_vcpu.ctrlreg[0] &
> X86_CR0_TS); ?
> Otherwise, this patch reintroduces the path which unconditionally uses
> stts() around an EFI RS call.

We want an uncondtional stts() here unless in fully eager mode. That's the
crux with the parameter name: In fully eager mode, we clearly do not want
stts(), but otherwise and without doing anything in the function here, this
specific call path needs it. The other two paths don't:
- __context_switch() assumes CR0.TS is still set from the most recent
  vcpu_save_fpu() (i.e. it is simply an optimization to avoid the stts()),
- hvmemul_put_fpu() invokes the function only for fully-eager vCPU-s.


Xen-devel mailing list



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