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...@sifive.com>
Signed-off-by: Vincent Chen <vincent.c...@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

Reply via email to