riscv: vector: allow kernel-mode Vector with preemption
authorAndy Chiu <andy.chiu@sifive.com>
Mon, 15 Jan 2024 05:59:29 +0000 (05:59 +0000)
committerPalmer Dabbelt <palmer@rivosinc.com>
Tue, 16 Jan 2024 15:14:02 +0000 (07:14 -0800)
commit2080ff9493072a94e42b1856d59f5f1bffb761b7
tree4e79b0581b55d4ce2bff3e05c1d641183e556741
parentbd446f5df5afab212917f6732ba6442a5e8de85e
riscv: vector: allow kernel-mode Vector with preemption

Add kernel_vstate to keep track of kernel-mode Vector registers when
trap introduced context switch happens. Also, provide riscv_v_flags to
let context save/restore routine track context status. Context tracking
happens whenever the core starts its in-kernel Vector executions. An
active (dirty) kernel task's V contexts will be saved to memory whenever
a trap-introduced context switch happens. Or, when a softirq, which
happens to nest on top of it, uses Vector. Context retoring happens when
the execution transfer back to the original Kernel context where it
first enable preempt_v.

Also, provide a config CONFIG_RISCV_ISA_V_PREEMPTIVE to give users an
option to disable preemptible kernel-mode Vector at build time. Users
with constraint memory may want to disable this config as preemptible
kernel-mode Vector needs extra space for tracking of per thread's
kernel-mode V context. Or, users might as well want to disable it if all
kernel-mode Vector code is time sensitive and cannot tolerate context
switch overhead.

Signed-off-by: Andy Chiu <andy.chiu@sifive.com>
Tested-by: Björn Töpel <bjorn@rivosinc.com>
Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Link: https://lore.kernel.org/r/20240115055929.4736-11-andy.chiu@sifive.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/Kconfig
arch/riscv/include/asm/asm-prototypes.h
arch/riscv/include/asm/processor.h
arch/riscv/include/asm/simd.h
arch/riscv/include/asm/vector.h
arch/riscv/kernel/entry.S
arch/riscv/kernel/kernel_mode_vector.c
arch/riscv/kernel/process.c
arch/riscv/kernel/vector.c