lkml.org 
[lkml]   [2017]   [Sep]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 17/33] x86/fpu: Split the state handling in fpu__drop()
    Date
    Prepare fpu__drop() to use fpu->fpregs_active.

    There are two distinct usecases for fpu__drop() in this context:
    exit_thread() when called for 'current' in exit(), and when called
    for another task in fork().

    This patch does not change behavior, it only adds a couple of
    debug checks and structures the code to make the ->fpregs_active
    change more obviously correct.

    All the complications will be removed later on.

    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Fenghua Yu <fenghua.yu@intel.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Yu-cheng Yu <yu-cheng.yu@intel.com>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    ---
    arch/x86/kernel/fpu/core.c | 19 +++++++++++++------
    1 file changed, 13 insertions(+), 6 deletions(-)

    diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c
    index b7dc3833d41a..815dfba7781a 100644
    --- a/arch/x86/kernel/fpu/core.c
    +++ b/arch/x86/kernel/fpu/core.c
    @@ -414,12 +414,19 @@ void fpu__drop(struct fpu *fpu)
    {
    preempt_disable();

    - if (fpu->fpregs_active) {
    - /* Ignore delayed exceptions from user space */
    - asm volatile("1: fwait\n"
    - "2:\n"
    - _ASM_EXTABLE(1b, 2b));
    - fpregs_deactivate(fpu);
    + if (fpu == &current->thread.fpu) {
    + WARN_ON_FPU(fpu->fpstate_active != fpu->fpregs_active);
    +
    + if (fpu->fpregs_active) {
    + /* Ignore delayed exceptions from user space */
    + asm volatile("1: fwait\n"
    + "2:\n"
    + _ASM_EXTABLE(1b, 2b));
    + if (fpu->fpregs_active)
    + fpregs_deactivate(fpu);
    + }
    + } else {
    + WARN_ON_FPU(fpu->fpregs_active);
    }

    fpu->fpstate_active = 0;
    --
    2.11.0
    \
     
     \ /
      Last update: 2017-09-23 15:06    [W:5.365 / U:0.656 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site