diff options
| -rw-r--r-- | arch/x86/kernel/i387.c | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index a81572338243..12088a3f459f 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c | |||
| @@ -81,9 +81,7 @@ void __kernel_fpu_begin(void) | |||
| 81 | this_cpu_write(in_kernel_fpu, true); | 81 | this_cpu_write(in_kernel_fpu, true); |
| 82 | 82 | ||
| 83 | if (__thread_has_fpu(me)) { | 83 | if (__thread_has_fpu(me)) { |
| 84 | __thread_clear_has_fpu(me); | ||
| 85 | __save_init_fpu(me); | 84 | __save_init_fpu(me); |
| 86 | /* We do 'stts()' in __kernel_fpu_end() */ | ||
| 87 | } else if (!use_eager_fpu()) { | 85 | } else if (!use_eager_fpu()) { |
| 88 | this_cpu_write(fpu_owner_task, NULL); | 86 | this_cpu_write(fpu_owner_task, NULL); |
| 89 | clts(); | 87 | clts(); |
| @@ -93,17 +91,12 @@ EXPORT_SYMBOL(__kernel_fpu_begin); | |||
| 93 | 91 | ||
| 94 | void __kernel_fpu_end(void) | 92 | void __kernel_fpu_end(void) |
| 95 | { | 93 | { |
| 96 | if (use_eager_fpu()) { | 94 | struct task_struct *me = current; |
| 97 | /* | 95 | |
| 98 | * For eager fpu, most the time, tsk_used_math() is true. | 96 | if (__thread_has_fpu(me)) { |
| 99 | * Restore the user math as we are done with the kernel usage. | 97 | if (WARN_ON(restore_fpu_checking(me))) |
| 100 | * At few instances during thread exit, signal handling etc, | 98 | drop_init_fpu(me); |
| 101 | * tsk_used_math() is false. Those few places will take proper | 99 | } else if (!use_eager_fpu()) { |
| 102 | * actions, so we don't need to restore the math here. | ||
| 103 | */ | ||
| 104 | if (likely(tsk_used_math(current))) | ||
| 105 | math_state_restore(); | ||
| 106 | } else { | ||
| 107 | stts(); | 100 | stts(); |
| 108 | } | 101 | } |
| 109 | 102 | ||
