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

Re: [Xen-devel] [PATCH] X86: Fix vcpu xsave bug


  • To: Jan Beulich <JBeulich@xxxxxxxx>
  • From: "Liu, Jinsong" <jinsong.liu@xxxxxxxxx>
  • Date: Mon, 18 Nov 2013 14:18:02 +0000
  • Accept-language: en-US
  • Cc: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Mon, 18 Nov 2013 14:18:10 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xen.org>
  • Thread-index: AQHO5FyqEMsBhgs/bUK0+0m1M8cBrJorAJLggAAGNFA=
  • Thread-topic: [Xen-devel] [PATCH] X86: Fix vcpu xsave bug

Liu, Jinsong wrote:
> Jan Beulich wrote:
>>>>> On 18.11.13 at 13:24, "Liu, Jinsong" <jinsong.liu@xxxxxxxxx>
>>>>> wrote: 
>>> Jan Beulich wrote:
>>>>>>> On 18.11.13 at 11:35, "Liu, Jinsong" <jinsong.liu@xxxxxxxxx>
>>>>>>> wrote:
>>>>> Jan Beulich wrote:
>>>>>>>>> On 15.11.13 at 17:55, "Liu, Jinsong" <jinsong.liu@xxxxxxxxx>
>>>>>>>>> wrote:
>>>>>>> @@ -257,22 +257,29 @@ void vcpu_restore_fpu_lazy(struct vcpu *v)
>>>>>>>  */ void vcpu_save_fpu(struct vcpu *v)
>>>>>>>  {
>>>>>>> -    if ( !v->fpu_dirtied )
>>>>>>> -        return;
>>>>>>> -
>>>>>> 
>>>>>> And the - afaict - the only changed needed to this function is
>>>>>> the deletion above. 
>>>>>> 
>>>>> 
>>>>> If I didn't misunderstand your meaning, it can not only delete
>>>>> these 2 lines, say, when (!v->fpu_dirtied) and in old platform
>>>>> that do fpu_fxsave/fpu_fsave?
>>>> 
>>>> Sorry, I don't understand what you're asking.
>>>> 
>>> 
>>> The problem is I don't understand your last comments:
>>> 'And the - afaict - the only changed needed to this function is the
>>> deletion above.' 
>>> 
>>> Seems some misunderstanding here :)
>>> So would you please give me the code of your thought based on the
>>> patch below?
>> 
>> void vcpu_save_fpu(struct vcpu *v)
>> {
>>     ASSERT(!is_idle_vcpu(v));
>> 
>>     /* This can happen, if a paravirtualised guest OS has set its   
>> CR0.TS. */ clts(); 
>> 
>>     if ( cpu_has_xsave )
>>         fpu_xsave(v);
>>     else if ( !v->fpu_dirtied )
>>         /* nothing */;
>>     else if ( cpu_has_fxsr )
>>         fpu_fxsave(v);
>>     else
>>         fpu_fsave(v);
>> 
>>     v->fpu_dirtied = 0;
>>     stts();
>> }
>> 
> 
> But that we need add logic at fpu_xsave(), like
> 
> if ( v->fpu_dirtied )
> {
>     if ( v->arch.nonlazy_xstate_used )
>         mask = XSTATE_ALL;
>     else
>         mask = XSTATE_LAZY;
> }
> else
> {
>     if ( v->arch.nonlazy_xstate_used )
>         mask = XSTATE_NONLAZY;
>     else
>         mask = 0;
> }
> 
> xsave(v, mask);
> 
> This way (new vcpu_save_fpu + new fpu_xsave) is some obscure, and
> calling fpu_xsave may do nothing. So how about keep old patch, use
> 'mask' to directly tell fpu_xsave what we want it to save? 
> 

Hmm, just find that my old patch also has issue: it didn't handle the case of 
XSTATE_LAZY  ( v->fpu_dirtied && !v->arch.nonlazy_xstate_used )
I will update based on your approach.

Thanks,
Jinsong

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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