diff mbox series

[v2] xstate: make use_xsave non-init

Message ID 20190905160424.6686-1-roger.pau@citrix.com (mailing list archive)
State New, archived
Headers show
Series [v2] xstate: make use_xsave non-init | expand

Commit Message

Roger Pau Monné Sept. 5, 2019, 4:04 p.m. UTC
LLVM code generation can attempt to load from a variable in the next
condition of an expression under certain circumstances, thus
attempting to load use_xsave regardless of the value of the bsp
variable, which leads to a page fault when the init section has
already been unmapped.

Fix this by making use_xsave non-init, thus preventing the page fault.
The LLVM bug with the discussion about this issue can be found at:

https://bugs.llvm.org/show_bug.cgi?id=39707

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
---
 xen/arch/x86/xstate.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Comments

Jan Beulich Sept. 6, 2019, 1:33 p.m. UTC | #1
On 05.09.2019 18:04, Roger Pau Monne wrote:
> --- a/xen/arch/x86/xstate.c
> +++ b/xen/arch/x86/xstate.c
> @@ -577,7 +577,11 @@ unsigned int xstate_ctxt_size(u64 xcr0)
>  /* Collect the information of processor's extended state */
>  void xstate_init(struct cpuinfo_x86 *c)
>  {
> -    static bool __initdata use_xsave = true;
> +    /*
> +     * NB: use_xsave cannot live in initdata because llvm might optimize
> +     * reading it, see: https://bugs.llvm.org/show_bug.cgi?id=39707
> +     */
> +    static bool use_xsave = true;
>      boolean_param("xsave", use_xsave);
>  
>      bool bsp = c == &boot_cpu_data;

I think we'd want to use __read_mostly then instead. Can be added
while committing of course, if you agree. With the addition
Acked-by: Jan Beulich <jbeulich@suse.com>

Jan
Roger Pau Monné Sept. 6, 2019, 1:37 p.m. UTC | #2
On Fri, Sep 06, 2019 at 03:33:50PM +0200, Jan Beulich wrote:
> On 05.09.2019 18:04, Roger Pau Monne wrote:
> > --- a/xen/arch/x86/xstate.c
> > +++ b/xen/arch/x86/xstate.c
> > @@ -577,7 +577,11 @@ unsigned int xstate_ctxt_size(u64 xcr0)
> >  /* Collect the information of processor's extended state */
> >  void xstate_init(struct cpuinfo_x86 *c)
> >  {
> > -    static bool __initdata use_xsave = true;
> > +    /*
> > +     * NB: use_xsave cannot live in initdata because llvm might optimize
> > +     * reading it, see: https://bugs.llvm.org/show_bug.cgi?id=39707
> > +     */
> > +    static bool use_xsave = true;
> >      boolean_param("xsave", use_xsave);
> >  
> >      bool bsp = c == &boot_cpu_data;
> 
> I think we'd want to use __read_mostly then instead. Can be added
> while committing of course, if you agree. With the addition
> Acked-by: Jan Beulich <jbeulich@suse.com>

Yes, that seems OK to me. Feel free to expand the commit message to
mention the change to read_mostly if you want.

Thanks, Roger.
diff mbox series

Patch

diff --git a/xen/arch/x86/xstate.c b/xen/arch/x86/xstate.c
index 3293ef834f..1dddda2818 100644
--- a/xen/arch/x86/xstate.c
+++ b/xen/arch/x86/xstate.c
@@ -577,7 +577,11 @@  unsigned int xstate_ctxt_size(u64 xcr0)
 /* Collect the information of processor's extended state */
 void xstate_init(struct cpuinfo_x86 *c)
 {
-    static bool __initdata use_xsave = true;
+    /*
+     * NB: use_xsave cannot live in initdata because llvm might optimize
+     * reading it, see: https://bugs.llvm.org/show_bug.cgi?id=39707
+     */
+    static bool use_xsave = true;
     boolean_param("xsave", use_xsave);
 
     bool bsp = c == &boot_cpu_data;