]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
x86/fpu: Remove user_fpu_begin()
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Wed, 3 Apr 2019 16:41:37 +0000 (18:41 +0200)
committerBorislav Petkov <bp@suse.de>
Wed, 10 Apr 2019 13:58:44 +0000 (15:58 +0200)
user_fpu_begin() sets fpu_fpregs_owner_ctx to task's fpu struct. This is
always the case since there is no lazy FPU anymore.

fpu_fpregs_owner_ctx is used during context switch to decide if it needs
to load the saved registers or if the currently loaded registers are
valid. It could be skipped during a

  taskA -> kernel thread -> taskA

switch because the switch to the kernel thread would not alter the CPU's
sFPU tate.

Since this field is always updated during context switch and
never invalidated, setting it manually (in user context) makes no
difference. A kernel thread with kernel_fpu_begin() block could
set fpu_fpregs_owner_ctx to NULL but a kernel thread does not use
user_fpu_begin().

This is a leftover from the lazy-FPU time.

Remove user_fpu_begin(), it does not change fpu_fpregs_owner_ctx's
content.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Dave Hansen <dave.hansen@intel.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Aubrey Li <aubrey.li@intel.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jann Horn <jannh@google.com>
Cc: "Jason A. Donenfeld" <Jason@zx2c4.com>
Cc: kvm ML <kvm@vger.kernel.org>
Cc: Nicolai Stange <nstange@suse.de>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Cc: Rik van Riel <riel@surriel.com>
Cc: x86-ml <x86@kernel.org>
Link: https://lkml.kernel.org/r/20190403164156.19645-9-bigeasy@linutronix.de
arch/x86/include/asm/fpu/internal.h
arch/x86/kernel/fpu/core.c
arch/x86/kernel/fpu/signal.c

index 04042eacc8525bbc0be3251a6b2a1b99e29201a5..54f70cae2f15f0bfae1a9f3e5a766861adf0d60d 100644 (file)
@@ -532,23 +532,6 @@ static inline void switch_fpu_finish(struct fpu *new_fpu, int cpu)
        }
 }
 
-/*
- * Needs to be preemption-safe.
- *
- * NOTE! user_fpu_begin() must be used only immediately before restoring
- * the save state. It does not do any saving/restoring on its own. In
- * lazy FPU mode, it is just an optimization to avoid a #NM exception,
- * the task can lose the FPU right after preempt_enable().
- */
-static inline void user_fpu_begin(void)
-{
-       struct fpu *fpu = &current->thread.fpu;
-
-       preempt_disable();
-       fpregs_activate(fpu);
-       preempt_enable();
-}
-
 /*
  * MXCSR and XCR definitions:
  */
index 97e27de2b7c05ec50b3e7bac10c6e4b4a41cdd2f..739ca3ae2bdcdbe2f05bf5aa0940e0bf1ba84bda 100644 (file)
@@ -335,10 +335,8 @@ void fpu__clear(struct fpu *fpu)
         * Make sure fpstate is cleared and initialized.
         */
        fpu__initialize(fpu);
-       if (static_cpu_has(X86_FEATURE_FPU)) {
-               user_fpu_begin();
+       if (static_cpu_has(X86_FEATURE_FPU))
                copy_init_fpstate_to_fpregs();
-       }
 }
 
 /*
index 34989d2a8893c31837a534691d168c77d5ec6138..155f4552413e7451f528e4c2684ad38514f9655b 100644 (file)
@@ -322,7 +322,6 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
                 * For 64-bit frames and 32-bit fsave frames, restore the user
                 * state to the registers directly (with exceptions handled).
                 */
-               user_fpu_begin();
                if (copy_user_to_fpregs_zeroing(buf_fx, xfeatures, fx_only)) {
                        fpu__clear(fpu);
                        return -1;