x86/fpu: Change math_error() to use unlazy_fpu(), kill (now) unused save_init_fpu()
authorOleg Nesterov <oleg@redhat.com>
Fri, 6 Feb 2015 20:02:00 +0000 (15:02 -0500)
committerBorislav Petkov <bp@suse.de>
Thu, 19 Feb 2015 10:15:03 +0000 (11:15 +0100)
math_error() calls save_init_fpu() after conditional_sti(), this means
that the caller can be preempted. If !use_eager_fpu() we can hit the
WARN_ON_ONCE(!__thread_has_fpu(tsk)) and/or save the wrong FPU state.

Change math_error() to use unlazy_fpu() and kill save_init_fpu().

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Rik van Riel <riel@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: http://lkml.kernel.org/r/1423252925-14451-4-git-send-email-riel@redhat.com
Signed-off-by: Borislav Petkov <bp@suse.de>
arch/x86/include/asm/fpu-internal.h
arch/x86/kernel/traps.c

index e97622f577229e431cd2f49c7b3aa30bb9f31ce8..02f2e0817918452ff28fb581a51e333d617dbd05 100644 (file)
@@ -517,24 +517,6 @@ static inline void __save_fpu(struct task_struct *tsk)
                fpu_fxsave(&tsk->thread.fpu);
 }
 
-/*
- * These disable preemption on their own and are safe
- */
-static inline void save_init_fpu(struct task_struct *tsk)
-{
-       WARN_ON_ONCE(!__thread_has_fpu(tsk));
-
-       if (use_eager_fpu()) {
-               __save_fpu(tsk);
-               return;
-       }
-
-       preempt_disable();
-       __save_init_fpu(tsk);
-       __thread_fpu_end(tsk);
-       preempt_enable();
-}
-
 /*
  * i387 state interaction
  */
index 88900e288021f23a2f22aebf739e25070f456971..9d889f74e80699066aac279bebe79ee6906e3d6e 100644 (file)
@@ -663,7 +663,7 @@ static void math_error(struct pt_regs *regs, int error_code, int trapnr)
        /*
         * Save the info for the exception handler and clear the error.
         */
-       save_init_fpu(task);
+       unlazy_fpu(task);
        task->thread.trap_nr = trapnr;
        task->thread.error_code = error_code;
        info.si_signo = SIGFPE;