From: Rik van Riel <r...@surriel.com>

If TIF_LOAD_FPU is set, then the registers are saved (not loaded). In that case
we skip the saving part.

Signed-off-by: Rik van Riel <r...@surriel.com>
Signed-off-by: Sebastian Andrzej Siewior <bige...@linutronix.de>
---
 arch/x86/kernel/fpu/signal.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/fpu/signal.c b/arch/x86/kernel/fpu/signal.c
index ff6e7a67522d8..906efd9572ffa 100644
--- a/arch/x86/kernel/fpu/signal.c
+++ b/arch/x86/kernel/fpu/signal.c
@@ -155,13 +155,17 @@ int copy_fpstate_to_sigframe(void __user *buf, void 
__user *buf_fx, int size)
                        sizeof(struct user_i387_ia32_struct), NULL,
                        (struct _fpstate_32 __user *) buf) ? -1 : 1;
 
-       /* Update the thread's fxstate to save the fsave header. */
-       if (ia32_fxstate)
-               copy_fxregs_to_kernel(fpu);
-       else {
-               copy_fpregs_to_fpstate(fpu);
-               fpregs_deactivate(fpu);
+       __fpregs_changes_begin();
+       if (!test_thread_flag(TIF_LOAD_FPU)) {
+               /* Update the thread's fxstate to save the fsave header. */
+               if (ia32_fxstate)
+                       copy_fxregs_to_kernel(fpu);
+               else {
+                       copy_fpregs_to_fpstate(fpu);
+                       fpregs_deactivate(fpu);
+               }
        }
+       __fpregs_changes_end();
 
        if (using_compacted_format()) {
                copy_xstate_to_user(buf_fx, xsave, 0, size);
-- 
2.19.0

Reply via email to