lkml.org 
[lkml]   [2020]   [Sep]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v7 20/21] riscv: Allocate space for vector registers in start_thread()
    Date
    It allocates memory space for vector registers in start_thread() instead of
    allocating in vstate_restore() in this patch. We can allocate memory here
    so that it will be more readable.

    Signed-off-by: Greentime Hu <greentime.hu@sifive.com>
    Signed-off-by: Vincent Chen <vincent.chen@sifive.com>
    ---
    arch/riscv/include/asm/switch_to.h | 7 +------
    arch/riscv/kernel/process.c | 8 ++++++++
    2 files changed, 9 insertions(+), 6 deletions(-)

    diff --git a/arch/riscv/include/asm/switch_to.h b/arch/riscv/include/asm/switch_to.h
    index d33a86a48f0d..58898d33bf28 100644
    --- a/arch/riscv/include/asm/switch_to.h
    +++ b/arch/riscv/include/asm/switch_to.h
    @@ -98,12 +98,6 @@ static inline void vstate_restore(struct task_struct *task,
    {
    if ((regs->status & SR_VS) != SR_VS_OFF) {
    struct __riscv_v_state *vstate = &(task->thread.vstate);
    -
    - /* Allocate space for vector registers. */
    - if (!vstate->datap) {
    - vstate->datap = kzalloc(riscv_vsize, GFP_ATOMIC);
    - vstate->size = riscv_vsize;
    - }
    __vstate_restore(vstate, vstate->datap);
    __vstate_clean(regs);
    }
    @@ -122,6 +116,7 @@ static inline void __switch_to_vector(struct task_struct *prev,

    #else
    #define has_vector false
    +#define riscv_vsize (0)
    #define vstate_save(task, regs) do { } while (0)
    #define vstate_restore(task, regs) do { } while (0)
    #define __switch_to_vector(__prev, __next) do { } while (0)
    diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c
    index fb485c9bceee..009ab4849fce 100644
    --- a/arch/riscv/kernel/process.c
    +++ b/arch/riscv/kernel/process.c
    @@ -84,7 +84,15 @@ void start_thread(struct pt_regs *regs, unsigned long pc,
    }

    if (has_vector) {
    + struct __riscv_v_state *vstate = &(current->thread.vstate);
    +
    + /* Enable vector and allocate memory for vector registers. */
    + vstate->datap = kzalloc(riscv_vsize, GFP_KERNEL);
    + if (WARN_ON(!vstate->datap))
    + return;
    + vstate->size = riscv_vsize;
    regs->status |= SR_VS_INITIAL;
    +
    /*
    * Restore the initial value to the vector register
    * before starting the user program.
    --
    2.28.0
    \
     
     \ /
      Last update: 2020-09-10 10:24    [W:3.013 / U:0.292 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site