x86/fpu: Pass 'struct fpu' to fpu__restore()
authorIngo Molnar <mingo@kernel.org>
Mon, 4 May 2015 09:49:58 +0000 (11:49 +0200)
committerIngo Molnar <mingo@kernel.org>
Tue, 19 May 2015 13:48:11 +0000 (15:48 +0200)
This cleans up the call sites and the function a bit,
and also makes it more symmetric with the other high
level FPU state handling functions.

It's still only valid for the current task, as we copy
to the FPU registers of the current CPU.

No change in functionality.

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: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/include/asm/fpu/internal.h
arch/x86/kernel/fpu/core.c
arch/x86/kernel/fpu/signal.c
arch/x86/kernel/traps.c
drivers/lguest/x86/core.c

index 7fdc90b9dd861285f9c17f127364e5adc5eb0c70..a4c1b7dbf70ead8712ebde8b24dec4e21327d9a0 100644 (file)
@@ -50,7 +50,7 @@ extern int  fpu__exception_code(struct fpu *fpu, int trap_nr);
 extern void fpu__activate_curr(struct fpu *fpu);
 extern void fpu__activate_stopped(struct fpu *fpu);
 extern void fpu__save(struct fpu *fpu);
-extern void fpu__restore(void);
+extern void fpu__restore(struct fpu *fpu);
 extern int  fpu__restore_sig(void __user *buf, int ia32_frame);
 extern void fpu__drop(struct fpu *fpu);
 extern int  fpu__copy(struct fpu *dst_fpu, struct fpu *src_fpu);
index d67558cdbddd3ab01f9a2e5b66cee3b166ea474d..c0661604a25816396e465745173a72592dd74638 100644 (file)
@@ -343,11 +343,8 @@ void fpu__activate_stopped(struct fpu *child_fpu)
  * with local interrupts disabled, as it is in the case of
  * do_device_not_available()).
  */
-void fpu__restore(void)
+void fpu__restore(struct fpu *fpu)
 {
-       struct task_struct *tsk = current;
-       struct fpu *fpu = &tsk->thread.fpu;
-
        fpu__activate_curr(fpu);
 
        /* Avoid __kernel_fpu_begin() right after fpregs_activate() */
@@ -355,9 +352,9 @@ void fpu__restore(void)
        fpregs_activate(fpu);
        if (unlikely(copy_fpstate_to_fpregs(fpu))) {
                fpu__clear(fpu);
-               force_sig_info(SIGSEGV, SEND_SIG_PRIV, tsk);
+               force_sig_info(SIGSEGV, SEND_SIG_PRIV, current);
        } else {
-               tsk->thread.fpu.counter++;
+               fpu->counter++;
        }
        kernel_fpu_enable();
 }
index 99f73093333dd73dcf6e4a85af9be9d75459228e..50ec9af1bd5189d9c51de284a383103842d9d60a 100644 (file)
@@ -319,7 +319,7 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
                fpu->fpstate_active = 1;
                if (use_eager_fpu()) {
                        preempt_disable();
-                       fpu__restore();
+                       fpu__restore(fpu);
                        preempt_enable();
                }
 
index 6f581c65c648c81a2583c9ee8637bd189227ee04..a2510f2301951a1c7b3b82a1b32b4687fcf501cf 100644 (file)
@@ -803,7 +803,7 @@ do_device_not_available(struct pt_regs *regs, long error_code)
                return;
        }
 #endif
-       fpu__restore(); /* interrupts still off */
+       fpu__restore(&current->thread.fpu); /* interrupts still off */
 #ifdef CONFIG_X86_32
        conditional_sti(regs);
 #endif
index 99bb3009e2d5f1b7ab5dc48d824707d97828c532..6a4cd771a2be62b4172cc26a178ca85fbf7e6d27 100644 (file)
@@ -302,7 +302,7 @@ void lguest_arch_run_guest(struct lg_cpu *cpu)
         * before this.
         */
        else if (cpu->regs->trapnum == 7 && !fpregs_active())
-               fpu__restore();
+               fpu__restore(&current->thread.fpu);
 }
 
 /*H:130