Skip to content

Commit 58122bf

Browse files
amlutoIngo Molnar
authored andcommitted
x86/fpu: Default eagerfpu=on on all CPUs
We have eager and lazy FPU modes, introduced in: 304bced ("x86, fpu: use non-lazy fpu restore for processors supporting xsave") The result is rather messy. There are two code paths in almost all of the FPU code, and only one of them (the eager case) is tested frequently, since most kernel developers have new enough hardware that we use eagerfpu. It seems that, on any remotely recent hardware, eagerfpu is a win: glibc uses SSE2, so laziness is probably overoptimistic, and, in any case, manipulating TS is far slower that saving and restoring the full state. (Stores to CR0.TS are serializing and are poorly optimized.) To try to shake out any latent issues on old hardware, this changes the default to eager on all CPUs. If no performance or functionality problems show up, a subsequent patch could remove lazy mode entirely. Signed-off-by: Andy Lutomirski <luto@kernel.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.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: Rik van Riel <riel@redhat.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/ac290de61bf08d9cfc2664a4f5080257ffc1075a.1453675014.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
1 parent c6ab109 commit 58122bf

File tree

1 file changed

+5
-8
lines changed

1 file changed

+5
-8
lines changed

arch/x86/kernel/fpu/init.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,10 @@ static void __init fpu__init_system_xstate_size_legacy(void)
260260
* not only saved the restores along the way, but we also have the
261261
* FPU ready to be used for the original task.
262262
*
263-
* 'eager' switching is used on modern CPUs, there we switch the FPU
263+
* 'lazy' is deprecated because it's almost never a performance win
264+
* and it's much more complicated than 'eager'.
265+
*
266+
* 'eager' switching is by default on all CPUs, there we switch the FPU
264267
* state during every context switch, regardless of whether the task
265268
* has used FPU instructions in that time slice or not. This is done
266269
* because modern FPU context saving instructions are able to optimize
@@ -271,7 +274,7 @@ static void __init fpu__init_system_xstate_size_legacy(void)
271274
* to use 'eager' restores, if we detect that a task is using the FPU
272275
* frequently. See the fpu->counter logic in fpu/internal.h for that. ]
273276
*/
274-
static enum { AUTO, ENABLE, DISABLE } eagerfpu = AUTO;
277+
static enum { ENABLE, DISABLE } eagerfpu = ENABLE;
275278

276279
/*
277280
* Find supported xfeatures based on cpu features and command-line input.
@@ -348,15 +351,9 @@ static void __init fpu__init_system_ctx_switch(void)
348351
*/
349352
static void __init fpu__init_parse_early_param(void)
350353
{
351-
/*
352-
* No need to check "eagerfpu=auto" again, since it is the
353-
* initial default.
354-
*/
355354
if (cmdline_find_option_bool(boot_command_line, "eagerfpu=off")) {
356355
eagerfpu = DISABLE;
357356
fpu__clear_eager_fpu_features();
358-
} else if (cmdline_find_option_bool(boot_command_line, "eagerfpu=on")) {
359-
eagerfpu = ENABLE;
360357
}
361358

362359
if (cmdline_find_option_bool(boot_command_line, "no387"))

0 commit comments

Comments
 (0)