lkml.org 
[lkml]   [2015]   [May]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 099/208] x86/fpu: Make the system/cpu init distinction clear in the xstate code as well
    Date
    Rename existing xstate init functions along the system/cpu init principles:

    fpu__init_system_xstate(): called once per system bootup
    fpu__init_cpu_xstate(): called per CPU onlining

    Also make the fpu__init_cpu_xstate() early code invariant:
    if xfeatures_mask is not set yet then don't crash but return.

    Reviewed-by: Borislav Petkov <bp@alien8.de>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Fenghua Yu <fenghua.yu@intel.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    ---
    arch/x86/include/asm/fpu/internal.h | 3 +++
    arch/x86/kernel/fpu/xsave.c | 22 ++++++++++++++--------
    2 files changed, 17 insertions(+), 8 deletions(-)

    diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h
    index 19b7cdf73efd..71d44be5acb1 100644
    --- a/arch/x86/include/asm/fpu/internal.h
    +++ b/arch/x86/include/asm/fpu/internal.h
    @@ -39,6 +39,9 @@ extern unsigned int mxcsr_feature_mask;
    extern void fpu__cpu_init(void);
    extern void eager_fpu_init(void);

    +extern void fpu__init_system_xstate(void);
    +extern void fpu__init_cpu_xstate(void);
    +
    DECLARE_PER_CPU(struct fpu *, fpu_fpregs_owner_ctx);

    extern void convert_from_fxsr(struct user_i387_ia32_struct *env,
    diff --git a/arch/x86/kernel/fpu/xsave.c b/arch/x86/kernel/fpu/xsave.c
    index 45130ba6f328..961c25850c7f 100644
    --- a/arch/x86/kernel/fpu/xsave.c
    +++ b/arch/x86/kernel/fpu/xsave.c
    @@ -460,10 +460,14 @@ static void prepare_fx_sw_frame(void)
    }

    /*
    - * Enable the extended processor state save/restore feature
    + * Enable the extended processor state save/restore feature.
    + * Called once per CPU onlining.
    */
    -static inline void xstate_enable(void)
    +void fpu__init_cpu_xstate(void)
    {
    + if (!xfeatures_mask)
    + return;
    +
    cr4_set_bits(X86_CR4_OSXSAVE);
    xsetbv(XCR_XFEATURE_ENABLED_MASK, xfeatures_mask);
    }
    @@ -640,11 +644,12 @@ static void __init init_xstate_size(void)

    /*
    * Enable and initialize the xsave feature.
    + * Called once per system bootup.
    *
    * ( Not marked __init because of false positive section warnings
    * generated by xsave_init(). )
    */
    -static void /* __init */ xstate_enable_boot_cpu(void)
    +void fpu__init_system_xstate(void)
    {
    unsigned int eax, ebx, ecx, edx;

    @@ -666,7 +671,8 @@ static void /* __init */ xstate_enable_boot_cpu(void)
    */
    xfeatures_mask = xfeatures_mask & XCNTXT_MASK;

    - xstate_enable();
    + /* Enable xstate instructions to be able to continue with initialization: */
    + fpu__init_cpu_xstate();

    /*
    * Recompute the context size for enabled features
    @@ -698,8 +704,8 @@ static void /* __init */ xstate_enable_boot_cpu(void)
    }

    /*
    - * For the very first instance, this calls xstate_enable_boot_cpu();
    - * for all subsequent instances, this calls xstate_enable().
    + * For the very first instance, this calls fpu__init_system_xstate();
    + * for all subsequent instances, this calls fpu__init_cpu_xstate().
    */
    void xsave_init(void)
    {
    @@ -715,9 +721,9 @@ void xsave_init(void)

    if (on_boot_cpu) {
    on_boot_cpu = 0;
    - xstate_enable_boot_cpu();
    + fpu__init_system_xstate();
    } else {
    - xstate_enable();
    + fpu__init_cpu_xstate();
    }
    }

    --
    2.1.0


    \
     
     \ /
      Last update: 2015-05-05 21:01    [W:2.689 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site