[PATCH v2 5/5] x86, fpu: introduce try_to_restore_fpu()

Oleg Nesterov
2014-09-05T13:46:24Z

Cosmetic. Every caller of restore_fpu_checking() does drop_init_fpu()
on failure, add the trivial helper and update the callers.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
arch/x86/include/asm/fpu-internal.h | 15 +++++++++++----
arch/x86/kernel/i387.c | 8 +++-----
arch/x86/kernel/traps.c | 8 +++-----
3 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/arch/x86/include/asm/fpu-internal.h b/arch/x86/include/asm/fpu-internal.h
index 4cbb40e..e71c7f5 100644
--- a/arch/x86/include/asm/fpu-internal.h
+++ b/arch/x86/include/asm/fpu-internal.h
@@ -384,6 +384,15 @@ static inline void drop_init_fpu(struct task_struct *tsk)
}
}

+static inline bool try_to_restore_fpu(struct task_struct *tsk)
+{
+ if (unlikely(restore_fpu_checking(tsk))) {
+ drop_init_fpu(tsk);
+ return false;
+ }
+ return true;
+}
+
/*
* FPU state switching for scheduling.
*
@@ -462,10 +471,8 @@ static inline fpu_switch_t switch_fpu_prepare(struct task_struct *old, struct ta
*/
static inline void switch_fpu_finish(struct task_struct *new, fpu_switch_t fpu)
{
- if (fpu.preload) {
- if (unlikely(restore_fpu_checking(new)))
- drop_init_fpu(new);
- }
+ if (fpu.preload)
+ try_to_restore_fpu(new);
}

/*
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c
index ece91cf..1918f67 100644
--- a/arch/x86/kernel/i387.c
+++ b/arch/x86/kernel/i387.c
@@ -104,12 +104,10 @@ void __kernel_fpu_end(void)
{
struct task_struct *me = current;

- if (__thread_has_fpu(me)) {
- if (WARN_ON(restore_fpu_checking(me)))
- drop_init_fpu(me);
- } else if (!use_eager_fpu()) {
+ if (__thread_has_fpu(me))
+ WARN_ON(!try_to_restore_fpu(me));
+ else if (!use_eager_fpu())
stts();
- }

this_cpu_write(in_kernel_fpu, false);
}
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index c632843..f516cf1 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -670,12 +670,10 @@ void math_state_restore(void)
/* Avoid __kernel_fpu_begin() right after __thread_fpu_begin() */
kernel_fpu_disable();
__thread_fpu_begin(tsk);
- if (unlikely(restore_fpu_checking(tsk))) {
- drop_init_fpu(tsk);
- force_sig_info(SIGSEGV, SEND_SIG_PRIV, tsk);
- } else {
+ if (likely(try_to_restore_fpu(tsk)))
tsk->thread.fpu_counter++;
- }
+ else
+ force_sig_info(SIGSEGV, SEND_SIG_PRIV, tsk);
kernel_fpu_enable();
}
EXPORT_SYMBOL_GPL(math_state_restore);
--
1.5.5.1