diff options
Diffstat (limited to 'arch/x86/kernel/i387.c')
| -rw-r--r-- | arch/x86/kernel/i387.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index e8368c6dd2a2..d5dd80814419 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c | |||
| @@ -86,10 +86,19 @@ EXPORT_SYMBOL(__kernel_fpu_begin); | |||
| 86 | 86 | ||
| 87 | void __kernel_fpu_end(void) | 87 | void __kernel_fpu_end(void) |
| 88 | { | 88 | { |
| 89 | if (use_eager_fpu()) | 89 | if (use_eager_fpu()) { |
| 90 | math_state_restore(); | 90 | /* |
| 91 | else | 91 | * For eager fpu, most the time, tsk_used_math() is true. |
| 92 | * Restore the user math as we are done with the kernel usage. | ||
| 93 | * At few instances during thread exit, signal handling etc, | ||
| 94 | * tsk_used_math() is false. Those few places will take proper | ||
| 95 | * actions, so we don't need to restore the math here. | ||
| 96 | */ | ||
| 97 | if (likely(tsk_used_math(current))) | ||
| 98 | math_state_restore(); | ||
| 99 | } else { | ||
| 92 | stts(); | 100 | stts(); |
| 101 | } | ||
| 93 | } | 102 | } |
| 94 | EXPORT_SYMBOL(__kernel_fpu_end); | 103 | EXPORT_SYMBOL(__kernel_fpu_end); |
| 95 | 104 | ||
