Skip to content

Commit a5fe93a

Browse files
yyu-intel-comIngo Molnar
authored andcommitted
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>
1 parent eb7c5f8 commit a5fe93a

File tree

3 files changed

+46
-14
lines changed

3 files changed

+46
-14
lines changed

arch/x86/include/asm/fpu/internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ extern void fpu__init_cpu_xstate(void);
4242
extern void fpu__init_system(struct cpuinfo_x86 *c);
4343
extern void fpu__init_check_bugs(void);
4444
extern void fpu__resume_cpu(void);
45+
extern u64 fpu__get_supported_xfeatures_mask(void);
4546

4647
/*
4748
* Debugging facility:

arch/x86/kernel/fpu/init.c

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,46 @@ static void __init fpu__init_system_xstate_size_legacy(void)
273273
*/
274274
static enum { AUTO, ENABLE, DISABLE } eagerfpu = AUTO;
275275

276+
/*
277+
* Find supported xfeatures based on cpu features and command-line input.
278+
* This must be called after fpu__init_parse_early_param() is called and
279+
* xfeatures_mask is enumerated.
280+
*/
281+
u64 __init fpu__get_supported_xfeatures_mask(void)
282+
{
283+
/* Support all xfeatures known to us */
284+
if (eagerfpu != DISABLE)
285+
return XCNTXT_MASK;
286+
287+
/* Warning of xfeatures being disabled for no eagerfpu mode */
288+
if (xfeatures_mask & XFEATURE_MASK_EAGER) {
289+
pr_err("x86/fpu: eagerfpu switching disabled, disabling the following xstate features: 0x%llx.\n",
290+
xfeatures_mask & XFEATURE_MASK_EAGER);
291+
}
292+
293+
/* Return a mask that masks out all features requiring eagerfpu mode */
294+
return ~XFEATURE_MASK_EAGER;
295+
}
296+
297+
/*
298+
* Disable features dependent on eagerfpu.
299+
*/
300+
static void __init fpu__clear_eager_fpu_features(void)
301+
{
302+
setup_clear_cpu_cap(X86_FEATURE_MPX);
303+
}
304+
276305
/*
277306
* Pick the FPU context switching strategy:
307+
*
308+
* When eagerfpu is AUTO or ENABLE, we ensure it is ENABLE if either of
309+
* the following is true:
310+
*
311+
* (1) the cpu has xsaveopt, as it has the optimization and doing eager
312+
* FPU switching has a relatively low cost compared to a plain xsave;
313+
* (2) the cpu has xsave features (e.g. MPX) that depend on eager FPU
314+
* switching. Should the kernel boot with noxsaveopt, we support MPX
315+
* with eager FPU switching at a higher cost.
278316
*/
279317
static void __init fpu__init_system_ctx_switch(void)
280318
{
@@ -286,19 +324,11 @@ static void __init fpu__init_system_ctx_switch(void)
286324
WARN_ON_FPU(current->thread.fpu.fpstate_active);
287325
current_thread_info()->status = 0;
288326

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

293-
if (xfeatures_mask & XFEATURE_MASK_EAGER) {
294-
if (eagerfpu == DISABLE) {
295-
pr_err("x86/fpu: eagerfpu switching disabled, disabling the following xstate features: 0x%llx.\n",
296-
xfeatures_mask & XFEATURE_MASK_EAGER);
297-
xfeatures_mask &= ~XFEATURE_MASK_EAGER;
298-
} else {
299-
eagerfpu = ENABLE;
300-
}
301-
}
330+
if (xfeatures_mask & XFEATURE_MASK_EAGER)
331+
eagerfpu = ENABLE;
302332

303333
if (eagerfpu == ENABLE)
304334
setup_force_cpu_cap(X86_FEATURE_EAGER_FPU);
@@ -316,10 +346,12 @@ static void __init fpu__init_parse_early_param(void)
316346
* No need to check "eagerfpu=auto" again, since it is the
317347
* initial default.
318348
*/
319-
if (cmdline_find_option_bool(boot_command_line, "eagerfpu=off"))
349+
if (cmdline_find_option_bool(boot_command_line, "eagerfpu=off")) {
320350
eagerfpu = DISABLE;
321-
else if (cmdline_find_option_bool(boot_command_line, "eagerfpu=on"))
351+
fpu__clear_eager_fpu_features();
352+
} else if (cmdline_find_option_bool(boot_command_line, "eagerfpu=on")) {
322353
eagerfpu = ENABLE;
354+
}
323355

324356
if (cmdline_find_option_bool(boot_command_line, "no387"))
325357
setup_clear_cpu_cap(X86_FEATURE_FPU);

arch/x86/kernel/fpu/xstate.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -633,8 +633,7 @@ void __init fpu__init_system_xstate(void)
633633
BUG();
634634
}
635635

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

639638
/* Enable xstate instructions to be able to continue with initialization: */
640639
fpu__init_cpu_xstate();

0 commit comments

Comments
 (0)