Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Will Deacon <will@kernel.org>

authored by

Suzuki K Poulose and committed by
Will Deacon
0cd82feb b51c6ac2

+6 -2
+6 -2
arch/arm64/include/asm/simd.h
··· 26 26 static __must_check inline bool may_use_simd(void) 27 27 { 28 28 /* 29 + * We must make sure that the SVE has been initialized properly 30 + * before using the SIMD in kernel. 29 31 * fpsimd_context_busy is only set while preemption is disabled, 30 32 * and is clear whenever preemption is enabled. Since 31 33 * this_cpu_read() is atomic w.r.t. preemption, fpsimd_context_busy ··· 35 33 * migrated, and if it's clear we cannot be migrated to a CPU 36 34 * where it is set. 37 35 */ 38 - return !in_irq() && !irqs_disabled() && !in_nmi() && 39 - !this_cpu_read(fpsimd_context_busy); 36 + return !WARN_ON(!system_capabilities_finalized()) && 37 + system_supports_fpsimd() && 38 + !in_irq() && !irqs_disabled() && !in_nmi() && 39 + !this_cpu_read(fpsimd_context_busy); 40 40 } 41 41 42 42 #else /* ! CONFIG_KERNEL_MODE_NEON */