Skip to content

Commit f893959

Browse files
oleg-nesterovIngo Molnar
authored andcommitted
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>
1 parent 9cb6ce8 commit f893959

File tree

1 file changed

+6
-9
lines changed

1 file changed

+6
-9
lines changed

arch/x86/kernel/process.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -132,17 +132,14 @@ void flush_thread(void)
132132
flush_ptrace_hw_breakpoint(tsk);
133133
memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));
134134

135-
drop_init_fpu(tsk);
136-
/*
137-
* Free the FPU state for non xsave platforms. They get reallocated
138-
* lazily at the first use.
139-
*/
140-
if (!use_eager_fpu())
135+
if (!use_eager_fpu()) {
136+
/* FPU state will be reallocated lazily at the first use. */
137+
drop_fpu(tsk);
141138
free_thread_xstate(tsk);
142-
else if (!used_math()) {
139+
} else if (!used_math()) {
143140
/* kthread execs. TODO: cleanup this horror. */
144-
if (WARN_ON(init_fpu(current)))
145-
force_sig(SIGKILL, current);
141+
if (WARN_ON(init_fpu(tsk)))
142+
force_sig(SIGKILL, tsk);
146143
user_fpu_begin();
147144
restore_init_xstate();
148145
}

0 commit comments

Comments
 (0)