lkml.org 
[lkml]   [2021]   [Jun]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch V3 22/66] x86/fpu: Move fpu__write_begin() to regset
    The only usecase for fpu__write_begin is the set() callback of regset, so
    the function is pointlessly global.

    Move it to the regset code and rename it to fpu_force_restore() which is
    exactly decribing what the function does.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    ---
    arch/x86/include/asm/fpu/internal.h | 1 -
    arch/x86/kernel/fpu/core.c | 24 ------------------------
    arch/x86/kernel/fpu/regset.c | 25 ++++++++++++++++++++++---
    3 files changed, 22 insertions(+), 28 deletions(-)

    --- a/arch/x86/include/asm/fpu/internal.h
    +++ b/arch/x86/include/asm/fpu/internal.h
    @@ -26,7 +26,6 @@
    /*
    * High level FPU state handling functions:
    */
    -extern void fpu__prepare_write(struct fpu *fpu);
    extern void fpu__save(struct fpu *fpu);
    extern int fpu__restore_sig(void __user *buf, int ia32_frame);
    extern void fpu__drop(struct fpu *fpu);
    --- a/arch/x86/kernel/fpu/core.c
    +++ b/arch/x86/kernel/fpu/core.c
    @@ -282,30 +282,6 @@ static void fpu__initialize(struct fpu *
    }

    /*
    - * This function must be called before we write a task's fpstate.
    - *
    - * Invalidate any cached FPU registers.
    - *
    - * After this function call, after registers in the fpstate are
    - * modified and the child task has woken up, the child task will
    - * restore the modified FPU state from the modified context. If we
    - * didn't clear its cached status here then the cached in-registers
    - * state pending on its former CPU could be restored, corrupting
    - * the modifications.
    - */
    -void fpu__prepare_write(struct fpu *fpu)
    -{
    - /*
    - * Only stopped child tasks can be used to modify the FPU
    - * state in the fpstate buffer:
    - */
    - WARN_ON_FPU(fpu == &current->thread.fpu);
    -
    - /* Invalidate any cached state: */
    - __fpu_invalidate_fpregs_state(fpu);
    -}
    -
    -/*
    * Drops current FPU state: deactivates the fpregs and
    * the fpstate. NOTE: it still leaves previous contents
    * in the fpregs in the eager-FPU case.
    --- a/arch/x86/kernel/fpu/regset.c
    +++ b/arch/x86/kernel/fpu/regset.c
    @@ -44,6 +44,25 @@ static void fpu_sync_fpstate(struct fpu
    fpu__save(fpu);
    }

    +/*
    + * Invalidate cached FPU registers before modifying the stopped target
    + * task's fpstate.
    + *
    + * This forces the target task on resume to restore the FPU registers from
    + * modified fpstate. Otherwise the task might skip the restore and operate
    + * with the cached FPU registers which discards the modifications.
    + */
    +static void fpu_force_restore(struct fpu *fpu)
    +{
    + /*
    + * Only stopped child tasks can be used to modify the FPU
    + * state in the fpstate buffer:
    + */
    + WARN_ON_FPU(fpu == &current->thread.fpu);
    +
    + __fpu_invalidate_fpregs_state(fpu);
    +}
    +
    int xfpregs_get(struct task_struct *target, const struct user_regset *regset,
    struct membuf to)
    {
    @@ -89,7 +108,7 @@ int xfpregs_set(struct task_struct *targ
    if (newstate.mxcsr & ~mxcsr_feature_mask)
    ret = -EINVAL;

    - fpu__prepare_write(fpu);
    + fpu_force_restore(fpu);

    /* Copy the state */
    memcpy(&fpu->state.fxsave, &newstate, sizeof(newstate));
    @@ -147,7 +166,7 @@ int xstateregs_set(struct task_struct *t
    }
    }

    - fpu__prepare_write(fpu);
    + fpu_force_restore(fpu);
    ret = copy_kernel_to_xstate(&fpu->state.xsave, kbuf ?: tmpbuf);

    out:
    @@ -347,7 +366,7 @@ int fpregs_set(struct task_struct *targe
    if (ret)
    return ret;

    - fpu__prepare_write(fpu);
    + fpu_force_restore(fpu);

    if (cpu_feature_enabled(X86_FEATURE_FXSR))
    convert_to_fxsr(&target->thread.fpu.state.fxsave, &env);
    \
     
     \ /
      Last update: 2021-06-18 17:21    [W:4.020 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site