lkml.org 
[lkml]   [2016]   [Jan]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/asm] x86/fpu: Disable MPX when eagerfpu is off
    Commit-ID:  a5fe93a549c54838063d2952dd9643b0b18aa67f
    Gitweb: http://git.kernel.org/tip/a5fe93a549c54838063d2952dd9643b0b18aa67f
    Author: yu-cheng yu <yu-cheng.yu@intel.com>
    AuthorDate: Wed, 6 Jan 2016 14:24:53 -0800
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitDate: Tue, 12 Jan 2016 11:51:21 +0100

    x86/fpu: Disable MPX when eagerfpu is off

    This issue is a fallout from the command-line parsing move.

    When "eagerfpu=off" is given as a command-line input, the kernel
    should disable MPX support. The decision for turning off MPX was
    made in fpu__init_system_ctx_switch(), which is after the
    selection of the XSAVE format. This patch fixes it by getting
    that decision done earlier in fpu__init_system_xstate().

    Signed-off-by: Yu-cheng Yu <yu-cheng.yu@intel.com>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Borislav Petkov <bp@suse.de>
    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: Peter Zijlstra <peterz@infradead.org>
    Cc: Quentin Casasnovas <quentin.casasnovas@oracle.com>
    Cc: Ravi V. Shankar <ravi.v.shankar@intel.com>
    Cc: Sai Praneeth Prakhya <sai.praneeth.prakhya@intel.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: yu-cheng yu <yu-cheng.yu@intel.com>
    Link: http://lkml.kernel.org/r/1452119094-7252-4-git-send-email-yu-cheng.yu@intel.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    ---
    arch/x86/include/asm/fpu/internal.h | 1 +
    arch/x86/kernel/fpu/init.c | 56 +++++++++++++++++++++++++++++--------
    arch/x86/kernel/fpu/xstate.c | 3 +-
    3 files changed, 46 insertions(+), 14 deletions(-)

    diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h
    index eadcdd5..0fd440d 100644
    --- a/arch/x86/include/asm/fpu/internal.h
    +++ b/arch/x86/include/asm/fpu/internal.h
    @@ -42,6 +42,7 @@ extern void fpu__init_cpu_xstate(void);
    extern void fpu__init_system(struct cpuinfo_x86 *c);
    extern void fpu__init_check_bugs(void);
    extern void fpu__resume_cpu(void);
    +extern u64 fpu__get_supported_xfeatures_mask(void);

    /*
    * Debugging facility:
    diff --git a/arch/x86/kernel/fpu/init.c b/arch/x86/kernel/fpu/init.c
    index 3a45fcd..f0ab368 100644
    --- a/arch/x86/kernel/fpu/init.c
    +++ b/arch/x86/kernel/fpu/init.c
    @@ -274,7 +274,45 @@ static void __init fpu__init_system_xstate_size_legacy(void)
    static enum { AUTO, ENABLE, DISABLE } eagerfpu = AUTO;

    /*
    + * Find supported xfeatures based on cpu features and command-line input.
    + * This must be called after fpu__init_parse_early_param() is called and
    + * xfeatures_mask is enumerated.
    + */
    +u64 __init fpu__get_supported_xfeatures_mask(void)
    +{
    + /* Support all xfeatures known to us */
    + if (eagerfpu != DISABLE)
    + return XCNTXT_MASK;
    +
    + /* Warning of xfeatures being disabled for no eagerfpu mode */
    + if (xfeatures_mask & XFEATURE_MASK_EAGER) {
    + pr_err("x86/fpu: eagerfpu switching disabled, disabling the following xstate features: 0x%llx.\n",
    + xfeatures_mask & XFEATURE_MASK_EAGER);
    + }
    +
    + /* Return a mask that masks out all features requiring eagerfpu mode */
    + return ~XFEATURE_MASK_EAGER;
    +}
    +
    +/*
    + * Disable features dependent on eagerfpu.
    + */
    +static void __init fpu__clear_eager_fpu_features(void)
    +{
    + setup_clear_cpu_cap(X86_FEATURE_MPX);
    +}
    +
    +/*
    * Pick the FPU context switching strategy:
    + *
    + * When eagerfpu is AUTO or ENABLE, we ensure it is ENABLE if either of
    + * the following is true:
    + *
    + * (1) the cpu has xsaveopt, as it has the optimization and doing eager
    + * FPU switching has a relatively low cost compared to a plain xsave;
    + * (2) the cpu has xsave features (e.g. MPX) that depend on eager FPU
    + * switching. Should the kernel boot with noxsaveopt, we support MPX
    + * with eager FPU switching at a higher cost.
    */
    static void __init fpu__init_system_ctx_switch(void)
    {
    @@ -286,19 +324,11 @@ static void __init fpu__init_system_ctx_switch(void)
    WARN_ON_FPU(current->thread.fpu.fpstate_active);
    current_thread_info()->status = 0;

    - /* Auto enable eagerfpu for xsaveopt */
    if (boot_cpu_has(X86_FEATURE_XSAVEOPT) && eagerfpu != DISABLE)
    eagerfpu = ENABLE;

    - if (xfeatures_mask & XFEATURE_MASK_EAGER) {
    - if (eagerfpu == DISABLE) {
    - pr_err("x86/fpu: eagerfpu switching disabled, disabling the following xstate features: 0x%llx.\n",
    - xfeatures_mask & XFEATURE_MASK_EAGER);
    - xfeatures_mask &= ~XFEATURE_MASK_EAGER;
    - } else {
    - eagerfpu = ENABLE;
    - }
    - }
    + if (xfeatures_mask & XFEATURE_MASK_EAGER)
    + eagerfpu = ENABLE;

    if (eagerfpu == ENABLE)
    setup_force_cpu_cap(X86_FEATURE_EAGER_FPU);
    @@ -316,10 +346,12 @@ static void __init fpu__init_parse_early_param(void)
    * No need to check "eagerfpu=auto" again, since it is the
    * initial default.
    */
    - if (cmdline_find_option_bool(boot_command_line, "eagerfpu=off"))
    + if (cmdline_find_option_bool(boot_command_line, "eagerfpu=off")) {
    eagerfpu = DISABLE;
    - else if (cmdline_find_option_bool(boot_command_line, "eagerfpu=on"))
    + fpu__clear_eager_fpu_features();
    + } else if (cmdline_find_option_bool(boot_command_line, "eagerfpu=on")) {
    eagerfpu = ENABLE;
    + }

    if (cmdline_find_option_bool(boot_command_line, "no387"))
    setup_clear_cpu_cap(X86_FEATURE_FPU);
    diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c
    index d489f27..d425cda5 100644
    --- a/arch/x86/kernel/fpu/xstate.c
    +++ b/arch/x86/kernel/fpu/xstate.c
    @@ -633,8 +633,7 @@ void __init fpu__init_system_xstate(void)
    BUG();
    }

    - /* Support only the state known to the OS: */
    - xfeatures_mask = xfeatures_mask & XCNTXT_MASK;
    + xfeatures_mask &= fpu__get_supported_xfeatures_mask();

    /* Enable xstate instructions to be able to continue with initialization: */
    fpu__init_cpu_xstate();
    \
     
     \ /
      Last update: 2016-01-12 13:41    [W:3.205 / U:0.300 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site