Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=92d140e21f1ce8cf99320afbbcad73879128e6dc
Commit:     92d140e21f1ce8cf99320afbbcad73879128e6dc
Parent:     efe44183f6bab5b8acb6a6182d95274978c8abb1
Author:     Siddha, Suresh B <[EMAIL PROTECTED]>
AuthorDate: Sun Nov 11 11:27:59 2007 -0800
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Mon Nov 12 11:09:33 2007 -0800

    x86: fix taking DNA during 64bit sigreturn
    
    restore sigcontext is taking a DNA exception while restoring FP context
    from the user stack, during the sigreturn.  Appended patch fixes it by
    doing clts() if the app doesn't touch FP during the signal handler
    execution.  This will stop generating a DNA, during the fxrstor in the
    sigreturn.
    
    This improves 64-bit lat_sig numbers by ~30% on my core2 platform.
    
    Signed-off-by: Suresh Siddha <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 arch/x86/kernel/i387_64.c |    9 +++++----
 include/asm-x86/i387_64.h |    5 +++++
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kernel/i387_64.c b/arch/x86/kernel/i387_64.c
index 56c1f11..bfaff28 100644
--- a/arch/x86/kernel/i387_64.c
+++ b/arch/x86/kernel/i387_64.c
@@ -92,13 +92,14 @@ int save_i387(struct _fpstate __user *buf)
        if (task_thread_info(tsk)->status & TS_USEDFPU) {
                err = save_i387_checking((struct i387_fxsave_struct __user 
*)buf);
                if (err) return err;
+               task_thread_info(tsk)->status &= ~TS_USEDFPU;
                stts();
-               } else {
-               if (__copy_to_user(buf, &tsk->thread.i387.fxsave, 
+       } else {
+               if (__copy_to_user(buf, &tsk->thread.i387.fxsave,
                                   sizeof(struct i387_fxsave_struct)))
                        return -1;
-       } 
-               return 1;
+       }
+       return 1;
 }
 
 /*
diff --git a/include/asm-x86/i387_64.h b/include/asm-x86/i387_64.h
index 0217b74..3a4ffba 100644
--- a/include/asm-x86/i387_64.h
+++ b/include/asm-x86/i387_64.h
@@ -203,6 +203,11 @@ static inline void save_init_fpu(struct task_struct *tsk)
  */
 static inline int restore_i387(struct _fpstate __user *buf)
 {
+       set_used_math();
+       if (!(task_thread_info(current)->status & TS_USEDFPU)) {
+               clts();
+               task_thread_info(current)->status |= TS_USEDFPU;
+       }
        return restore_fpu_checking((__force struct i387_fxsave_struct *)buf);
 }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to