WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] Re: Avoid alloc for xsave before xsave_init

To: Keir Fraser <keir@xxxxxxx>
Subject: [Xen-devel] Re: Avoid alloc for xsave before xsave_init
From: Wei Huang <wei.huang2@xxxxxxx>
Date: Thu, 13 Jan 2011 17:54:11 -0600
Cc: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>, "Wei, Gang" <gang.wei@xxxxxxxxx>
Delivery-date: Thu, 13 Jan 2011 15:56:24 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <C9551BFA.11CEB%keir@xxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <C9551BFA.11CEB%keir@xxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7
The test showed on my machine showed that xsave areas of idle vcpus are inconsistent. With four CPUs, the code did the following:

1. vcpu 0 of idle domain
* xsave_alloc_save_area() is called.
* xsave_cntxt_size is 0; so vcpu->arch.xsave_area is 0 bytes.
* vcpu->arch.xcr0 and vcpu->arch.xcr0_accum is 0x3.
2. Then, xsave_init() is called. xsave_cntxt_size is now initialized correctly.
3. After that, vcpu 1, 2, 3 of idle domain have
* xsave_alloc_save_area() is called.
* xsave_cntxt_size is correct; so vcpu->arch.xsave_area points to an allocated area.
* vcpu->arch.xcr0 and vcpu->arch.xcr0_accum is 0x3.

In other words, vcpu0 has a different xsave_area from other vcpus. I think the following patch should fix the issues above:


diff -r 20b0f709153e xen/arch/x86/i387.c
--- a/xen/arch/x86/i387.c       Wed Jan 12 14:14:13 2011 +0000
+++ b/xen/arch/x86/i387.c       Thu Jan 13 18:08:30 2011 -0600
@@ -33,7 +33,7 @@
     if ( cr0 & X86_CR0_TS )
         clts();

-    if ( cpu_has_xsave )
+    if ( cpu_has_xsave && !is_idle_vcpu(v) )
     {
/* XCR0 normally represents what guest OS set. In case of Xen itself,
          * we set all accumulated feature mask before doing save/restore.
@@ -214,7 +214,7 @@
 {
     void *save_area;

-    if ( !cpu_has_xsave )
+    if ( !cpu_has_xsave || is_idle_vcpu(v) )
         return 0;

     /* XSAVE/XRSTOR requires the save area be 64-byte-boundary aligned. */



On 01/13/2011 03:15 PM, Keir Fraser wrote:
On 13/01/2011 20:21, "Huang2, Wei"<Wei.Huang2@xxxxxxx>  wrote:

Hi Gang,

Was the issue caused by the uninitialized variable xsave_cntxt_size,
triggering problem for _xmalloc()? If so, one solution is to set
xsave_cntxt_size=576 (the default value after reset) as a default value. When
xsave_alloc_save_area() is called for idel VCPU, _xmalloc() will initialize
576 bytes. Idle domain doesn't change xcr0 from my understanding. So its xcr0
is XSTATE_FP_SSE all the time.
Idle domain isn't using FPU,SSE,AVX or any such extended state and doesn't
need it saved. Xsave_{alloc,free}_save_area() should test-and-exit on
is_idle_vcpu(), and our context switch code should not be doing XSAVE when
switching out an idle vcpu (I hope this is the case already, as it would be
a pointless waste of time).

  -- Keir

Best,
-Wei

-----Original Message-----
From: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
[mailto:xen-devel-bounces@xxxxxxxxxxxxxxxxxxx] On Behalf Of Wei, Gang
Sent: Thursday, January 13, 2011 12:49 PM
To: xen-devel@xxxxxxxxxxxxxxxxxxx
Cc: Keir Fraser; Wei, Gang
Subject: [Xen-devel] Avoid alloc for xsave before xsave_init

While debugging some weird booting failure bugs, just found currently,
xsave_alloc_save_area will be called in
init_idle_domain->scheduler_init->alloc_vcpu->vcpu_initialise calls, it is
earlier than xsave_init called in identity_cpu(). This may causing buffer
overflow on xmem_pool. I am thinking about how to fix it.

Jimmy

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel







_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel