Commit 92d140e2 authored by Siddha, Suresh B's avatar Siddha, Suresh B Committed by Linus Torvalds

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: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent efe44183
...@@ -92,13 +92,14 @@ int save_i387(struct _fpstate __user *buf) ...@@ -92,13 +92,14 @@ int save_i387(struct _fpstate __user *buf)
if (task_thread_info(tsk)->status & TS_USEDFPU) { if (task_thread_info(tsk)->status & TS_USEDFPU) {
err = save_i387_checking((struct i387_fxsave_struct __user *)buf); err = save_i387_checking((struct i387_fxsave_struct __user *)buf);
if (err) return err; if (err) return err;
task_thread_info(tsk)->status &= ~TS_USEDFPU;
stts(); stts();
} else { } else {
if (__copy_to_user(buf, &tsk->thread.i387.fxsave, if (__copy_to_user(buf, &tsk->thread.i387.fxsave,
sizeof(struct i387_fxsave_struct))) sizeof(struct i387_fxsave_struct)))
return -1; return -1;
} }
return 1; return 1;
} }
/* /*
......
...@@ -203,6 +203,11 @@ static inline void save_init_fpu(struct task_struct *tsk) ...@@ -203,6 +203,11 @@ static inline void save_init_fpu(struct task_struct *tsk)
*/ */
static inline int restore_i387(struct _fpstate __user *buf) 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); return restore_fpu_checking((__force struct i387_fxsave_struct *)buf);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment