| From df24fb859a4e200d9324e2974229fbb7adf00aef Mon Sep 17 00:00:00 2001 |
| From: Oleg Nesterov <oleg@redhat.com> |
| Date: Tue, 2 Sep 2014 19:57:17 +0200 |
| Subject: x86, fpu: __restore_xstate_sig()->math_state_restore() needs preempt_disable() |
| |
| From: Oleg Nesterov <oleg@redhat.com> |
| |
| commit df24fb859a4e200d9324e2974229fbb7adf00aef upstream. |
| |
| Add preempt_disable() + preempt_enable() around math_state_restore() in |
| __restore_xstate_sig(). Otherwise __switch_to() after __thread_fpu_begin() |
| can overwrite fpu->state we are going to restore. |
| |
| Signed-off-by: Oleg Nesterov <oleg@redhat.com> |
| Link: http://lkml.kernel.org/r/20140902175717.GA21649@redhat.com |
| Reviewed-by: Suresh Siddha <sbsiddha@gmail.com> |
| Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kernel/xsave.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/kernel/xsave.c |
| +++ b/arch/x86/kernel/xsave.c |
| @@ -402,8 +402,11 @@ int __restore_xstate_sig(void __user *bu |
| set_used_math(); |
| } |
| |
| - if (use_eager_fpu()) |
| + if (use_eager_fpu()) { |
| + preempt_disable(); |
| math_state_restore(); |
| + preempt_enable(); |
| + } |
| |
| return err; |
| } else { |