Commit 0cd82feb authored by Suzuki K Poulose's avatar Suzuki K Poulose Committed by Will Deacon

arm64: fpsimd: Make sure SVE setup is complete before SIMD is used

In-kernel users of NEON rely on may_use_simd() to check if the SIMD
can be used. However, we must initialize the SVE before SIMD can
be used. Add a sanity check to make sure that we have completed the
SVE setup before anyone uses the SIMD.

Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Will Deacon <will@kernel.org>
Reviewed-by: default avatarArd Biesheuvel <ardb@kernel.org>
Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent b51c6ac2
...@@ -26,6 +26,8 @@ DECLARE_PER_CPU(bool, fpsimd_context_busy); ...@@ -26,6 +26,8 @@ DECLARE_PER_CPU(bool, fpsimd_context_busy);
static __must_check inline bool may_use_simd(void) static __must_check inline bool may_use_simd(void)
{ {
/* /*
* We must make sure that the SVE has been initialized properly
* before using the SIMD in kernel.
* fpsimd_context_busy is only set while preemption is disabled, * fpsimd_context_busy is only set while preemption is disabled,
* and is clear whenever preemption is enabled. Since * and is clear whenever preemption is enabled. Since
* this_cpu_read() is atomic w.r.t. preemption, fpsimd_context_busy * this_cpu_read() is atomic w.r.t. preemption, fpsimd_context_busy
...@@ -33,8 +35,10 @@ static __must_check inline bool may_use_simd(void) ...@@ -33,8 +35,10 @@ static __must_check inline bool may_use_simd(void)
* migrated, and if it's clear we cannot be migrated to a CPU * migrated, and if it's clear we cannot be migrated to a CPU
* where it is set. * where it is set.
*/ */
return !in_irq() && !irqs_disabled() && !in_nmi() && return !WARN_ON(!system_capabilities_finalized()) &&
!this_cpu_read(fpsimd_context_busy); system_supports_fpsimd() &&
!in_irq() && !irqs_disabled() && !in_nmi() &&
!this_cpu_read(fpsimd_context_busy);
} }
#else /* ! CONFIG_KERNEL_MODE_NEON */ #else /* ! CONFIG_KERNEL_MODE_NEON */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment