diff options
author | Oleg Nesterov <oleg@redhat.com> | 2015-03-13 13:30:30 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-03-23 05:13:58 -0400 |
commit | f893959b0898bd876673adbeb6798bdf25c034d7 (patch) | |
tree | c0b9d2b3d247912f35e0f1304767e65975205842 | |
parent | 9cb6ce823bbd1adbe15e30bd1435c84c2e271767 (diff) |
x86/fpu: Don't abuse drop_init_fpu() in flush_thread()
flush_thread() -> drop_init_fpu() is suboptimal and confusing. It does
drop_fpu() or restore_init_xstate() depending on !use_eager_fpu(). But
flush_thread() too checks eagerfpu right after that, and if it is true
then restore_init_xstate() just burns CPU for no reason. We are going to
load init_xstate_buf again after we set used_math()/user_has_fpu(), until
then the FPU state can't survive after switch_to().
Remove it, and change the "if (!use_eager_fpu())" to call drop_fpu().
While at it, clean up the tsk/current usage.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Pekka Riikonen <priikone@iki.fi>
Cc: Quentin Casasnovas <quentin.casasnovas@oracle.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: Suresh Siddha <sbsiddha@gmail.com>
Link: http://lkml.kernel.org/r/20150313173030.GA31217@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | arch/x86/kernel/process.c | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 6b058296a456..1d2ebadba7ac 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
@@ -132,17 +132,14 @@ void flush_thread(void) | |||
132 | flush_ptrace_hw_breakpoint(tsk); | 132 | flush_ptrace_hw_breakpoint(tsk); |
133 | memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array)); | 133 | memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array)); |
134 | 134 | ||
135 | drop_init_fpu(tsk); | 135 | if (!use_eager_fpu()) { |
136 | /* | 136 | /* FPU state will be reallocated lazily at the first use. */ |
137 | * Free the FPU state for non xsave platforms. They get reallocated | 137 | drop_fpu(tsk); |
138 | * lazily at the first use. | ||
139 | */ | ||
140 | if (!use_eager_fpu()) | ||
141 | free_thread_xstate(tsk); | 138 | free_thread_xstate(tsk); |
142 | else if (!used_math()) { | 139 | } else if (!used_math()) { |
143 | /* kthread execs. TODO: cleanup this horror. */ | 140 | /* kthread execs. TODO: cleanup this horror. */ |
144 | if (WARN_ON(init_fpu(current))) | 141 | if (WARN_ON(init_fpu(tsk))) |
145 | force_sig(SIGKILL, current); | 142 | force_sig(SIGKILL, tsk); |
146 | user_fpu_begin(); | 143 | user_fpu_begin(); |
147 | restore_init_xstate(); | 144 | restore_init_xstate(); |
148 | } | 145 | } |