diff options
Diffstat (limited to 'debian/patches-rt/0025-x86-fpu-Add-a-fastpath-to-copy_fpstate_to_sigframe.patch')
-rw-r--r-- | debian/patches-rt/0025-x86-fpu-Add-a-fastpath-to-copy_fpstate_to_sigframe.patch | 79 |
1 files changed, 0 insertions, 79 deletions
diff --git a/debian/patches-rt/0025-x86-fpu-Add-a-fastpath-to-copy_fpstate_to_sigframe.patch b/debian/patches-rt/0025-x86-fpu-Add-a-fastpath-to-copy_fpstate_to_sigframe.patch deleted file mode 100644 index 3d4f1df09..000000000 --- a/debian/patches-rt/0025-x86-fpu-Add-a-fastpath-to-copy_fpstate_to_sigframe.patch +++ /dev/null @@ -1,79 +0,0 @@ -From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> -Date: Wed, 3 Apr 2019 15:59:12 +0200 -Subject: [PATCH 25/27] x86/fpu: Add a fastpath to copy_fpstate_to_sigframe() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.0/older/patches-5.0.10-rt7.tar.xz - -If the CPU holds the FPU register for the current task then we can try to save -them directly to the userland stack frame. This has to be done with the -pagefault disabled because we can't fault (while the FPU registers are locked) -and therefore the operation might fail. -If it fails try the slowpath which can handle faults. - -Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> ---- - arch/x86/kernel/fpu/signal.c | 34 ++++++++++++++++++++++------------ - 1 file changed, 22 insertions(+), 12 deletions(-) - ---- a/arch/x86/kernel/fpu/signal.c -+++ b/arch/x86/kernel/fpu/signal.c -@@ -144,8 +144,10 @@ static inline int copy_fpregs_to_sigfram - * buf == buf_fx for 64-bit frames and 32-bit fsave frame. - * buf != buf_fx for 32-bit frames with fxstate. - * -- * Save the state to task's fpu->state and then copy it to the user frame -- * pointed by the aligned pointer 'buf_fx'. -+ * Try to save it directly to the user frame with disabled page fault handler. -+ * If this fails then do the slow path where the FPU state is first saved to -+ * task's fpu->state and then copy it to the user frame pointed by the aligned -+ * pointer 'buf_fx'. - * - * If this is a 32-bit frame with fxstate, put a fsave header before - * the aligned state at 'buf_fx'. -@@ -159,6 +161,7 @@ int copy_fpstate_to_sigframe(void __user - struct xregs_state *xsave = &fpu->state.xsave; - struct task_struct *tsk = current; - int ia32_fxstate = (buf != buf_fx); -+ int ret = -EFAULT; - - ia32_fxstate &= (IS_ENABLED(CONFIG_X86_32) || - IS_ENABLED(CONFIG_IA32_EMULATION)); -@@ -174,22 +177,29 @@ int copy_fpstate_to_sigframe(void __user - fpregs_lock(); - /* - * If we do not need to load the FPU registers at return to userspace -- * then the CPU has the current state and we need to save it. Otherwise -- * it is already done and we can skip it. -+ * then the CPU has the current state. Try to save it directly to -+ * userland's stack frame if it does not cause a pagefault. If it does, -+ * try the slowpath. - */ - if (!test_thread_flag(TIF_NEED_FPU_LOAD)) { -- copy_fpregs_to_fpstate(fpu); -+ pagefault_disable(); -+ ret = copy_fpregs_to_sigframe(buf_fx); -+ pagefault_enable(); -+ if (ret) -+ copy_fpregs_to_fpstate(fpu); - set_thread_flag(TIF_NEED_FPU_LOAD); - } - fpregs_unlock(); - -- if (using_compacted_format()) { -- if (copy_xstate_to_user(buf_fx, xsave, 0, size)) -- return -1; -- } else { -- fpstate_sanitize_xstate(fpu); -- if (__copy_to_user(buf_fx, xsave, fpu_user_xstate_size)) -- return -1; -+ if (ret) { -+ if (using_compacted_format()) { -+ if (copy_xstate_to_user(buf_fx, xsave, 0, size)) -+ return -1; -+ } else { -+ fpstate_sanitize_xstate(fpu); -+ if (__copy_to_user(buf_fx, xsave, fpu_user_xstate_size)) -+ return -1; -+ } - } - - /* Save the fsave header for the 32-bit frames. */ |