mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 22:14:03 +02:00
riscv: vector: allow non-preemptible kernel-mode vector with IRQs off
Similar to commit 7137a203b2 ("arm64/fpsimd: Permit kernel mode NEON
with IRQs off"), we are upgrading get/put_cpu_vector_context such that
kvm_arch_vcpu_load/put can be safely called under both irq off and
regular process context.
Also, export both symbols so the kvm module can call into it.
Signed-off-by: Andy Chiu <tchiu@tenstorrent.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Link: https://lore.kernel.org/r/20260803215250.824417-3-tchiu@tenstorrent.com
Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
parent
8f798d6d7f
commit
848a973c5f
|
|
@ -36,20 +36,10 @@ static __must_check inline bool may_use_simd(void)
|
|||
/*
|
||||
* Nesting is achieved in preempt_v by spreading the control for
|
||||
* preemptible and non-preemptible kernel-mode Vector into two fields.
|
||||
* Always try to match with preempt_v if kernel V-context exists. Then,
|
||||
* fallback to check non preempt_v if nesting happens, or if the config
|
||||
* is not set.
|
||||
* Only non-preempt_v can nest on top of preempt_v, if non-preempt_v is
|
||||
* unavailable, then preempt_v is not allowed.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_RISCV_ISA_V_PREEMPTIVE) && current->thread.kernel_vstate.datap) {
|
||||
if (!riscv_preempt_v_started(current))
|
||||
return true;
|
||||
}
|
||||
/*
|
||||
* Non-preemptible kernel-mode Vector temporarily disables bh. So we
|
||||
* must not return true on irq_disabled(). Otherwise we would fail the
|
||||
* lockdep check calling local_bh_enable()
|
||||
*/
|
||||
return !irqs_disabled() && !(riscv_v_flags() & RISCV_KERNEL_MODE_V);
|
||||
return !(riscv_v_flags() & RISCV_KERNEL_MODE_V);
|
||||
}
|
||||
|
||||
#else /* ! CONFIG_RISCV_ISA_V */
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/percpu.h>
|
||||
#include <linux/preempt.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kvm_types.h>
|
||||
|
||||
#include <asm/vector.h>
|
||||
#include <asm/switch_to.h>
|
||||
|
|
@ -55,13 +56,16 @@ void get_cpu_vector_context(void)
|
|||
* disable softirqs so it is impossible for softirqs to nest
|
||||
* get_cpu_vector_context() when kernel is actively using Vector.
|
||||
*/
|
||||
if (!IS_ENABLED(CONFIG_PREEMPT_RT))
|
||||
local_bh_disable();
|
||||
else
|
||||
if (!IS_ENABLED(CONFIG_PREEMPT_RT)) {
|
||||
if (!irqs_disabled())
|
||||
local_bh_disable();
|
||||
} else {
|
||||
preempt_disable();
|
||||
}
|
||||
|
||||
riscv_v_start(RISCV_KERNEL_MODE_V);
|
||||
}
|
||||
EXPORT_SYMBOL_FOR_KVM(get_cpu_vector_context);
|
||||
|
||||
/*
|
||||
* Release the CPU vector context.
|
||||
|
|
@ -74,11 +78,14 @@ void put_cpu_vector_context(void)
|
|||
{
|
||||
riscv_v_stop(RISCV_KERNEL_MODE_V);
|
||||
|
||||
if (!IS_ENABLED(CONFIG_PREEMPT_RT))
|
||||
local_bh_enable();
|
||||
else
|
||||
if (!IS_ENABLED(CONFIG_PREEMPT_RT)) {
|
||||
if (!irqs_disabled())
|
||||
local_bh_enable();
|
||||
} else {
|
||||
preempt_enable();
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_FOR_KVM(put_cpu_vector_context);
|
||||
|
||||
#ifdef CONFIG_RISCV_ISA_V_PREEMPTIVE
|
||||
static __always_inline u32 *riscv_v_flags_ptr(void)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user