[v7, 02/10] riscv: vector: make Vector always available for softirq context
Eric Biggers
ebiggers at kernel.org
Thu Dec 21 21:35:19 PST 2023
On Thu, Dec 21, 2023 at 01:43:09PM +0000, Andy Chiu wrote:
> By disabling bottom halves in active kerne-mode Vector, softirq will not
> be able to nest on top of any kernel-mode Vector.
kerne => kernel
>
> After this patch, Vector context cannot start with irqs disabled.
> Otherwise local_bh_enable() may run in a wrong context.
>
> Disabling bh is not enough for RT-kernel to prevent preeemption. So
> we must disable preemption, which also implies disabling bh on RT.
The body of the commit message should explicitly mention the goal of the patch
(support kernel vector in softirq context) and why this is a desirable goal
(e.g., make it so that some of the crypto algorithms won't need fallbacks).
> diff --git a/arch/riscv/include/asm/simd.h b/arch/riscv/include/asm/simd.h
> index 3b603e47c5d8..7df5a976a80a 100644
> --- a/arch/riscv/include/asm/simd.h
> +++ b/arch/riscv/include/asm/simd.h
> @@ -28,8 +28,12 @@ static __must_check inline bool may_use_simd(void)
> /*
> * RISCV_KERNEL_MODE_V is only set while preemption is disabled,
> * and is clear whenever preemption is enabled.
> + *
> + * Kernel-mode Vector temperarily disables bh. So we must not return
> + * true on irq_disabled(). Otherwise we would fail the lockdep check
> + * calling local_bh_enable()
temperarily => temporarily
> diff --git a/arch/riscv/kernel/kernel_mode_vector.c b/arch/riscv/kernel/kernel_mode_vector.c
> index 105147c7d2da..db0cf06f2abf 100644
> --- a/arch/riscv/kernel/kernel_mode_vector.c
> +++ b/arch/riscv/kernel/kernel_mode_vector.c
> @@ -23,7 +23,10 @@
> */
> void get_cpu_vector_context(void)
> {
> - preempt_disable();
> + if (!IS_ENABLED(CONFIG_PREEMPT_RT))
> + local_bh_disable();
> + else
> + preempt_disable();
Maybe leave a comment here explaining why softirqs are being disabled?
Otherwise this patch looks good, thanks!
- Eric
More information about the linux-riscv
mailing list