Re: [PATCH v3 0/7] arm64: Fix support for no FP/SIMD

From: Ard Biesheuvel
Date: Tue Jan 14 2020 - 03:30:20 EST


On Tue, 14 Jan 2020 at 00:30, Suzuki K Poulose <suzuki.poulose@xxxxxxx> wrote:
>
> This series fixes the support for systems without FP/SIMD unit.
>
> We detect the absence of FP/SIMD after the SMP cpus are brought
> online (i.e, SYSTEM scope). This means, we allow a hotplugged
> CPU to boot successfully even if it doesn't have the FP/SIMD
> when we have decided otherwise at boot and have now advertised
> the ELF HWCAP for the userspace. Fix this by turning this to a
> BOOT_RESTRICTED_CPU_LOCAL feature to allow the detection of the
> feature the very moment a CPU turns up without FP/SIMD and also
> prevent a conflict after SMP boot.
>
> The COMPAT ELF_HWCAPs were statically set to indicate the
> availability of VFP. Make it dynamic to set the appropriate
> bits.
>
> Also, some of the early kernel threads (including init) could run
> with their TIF_FOREIGN_FPSTATE flag set which might be inherited
> by applications forked by them (e.g, modprobe from initramfs).
> Now, if we detect the absence of FP/SIMD we stop clearing the
> TIF flag in fpsimd_restore_current_state(). This could cause
> the applications stuck in do_notify_resume() looping forever
> to clear the flag. Fix this by clearing the TIF flag in
> fpsimd_restore_current_state() for the tasks that may
> have it set.
>
> This series also categorises the functions dealing with fpsimd
> into two :
>
> - Call permitted with missing FP/SIMD support. But we bail
> out early in the function. This is for functions exposed
> to the generic kernel code.
>
> - Calls not permitted with missing FP/SIMD support. These
> are functions which deal with the CPU/Task FP/SIMD registers
> and/or meta-data. The callers must check for the support
> before invoking them.
>
> See the last patch in the series for details.
>
> Also make sure that the SVE is initialised where supported,
> before the FP/SIMD is used by the kernel.
>
> Tested with debian armel initramfs and rootfs. The arm64 doesn't
> have a soft-float ABI, thus haven't tested it with 64bit userspace.
>
> Applies on linux-aarch64 for-next/core
>
> Changes since v2:
> - Rebase on to for-next/core, resolved conflict with the E0PD
> handling changes
> - Address comments from Catalin
> - Remove warnings from static functions
> - Add WARN_ON in may_use_simd() if called before initializing
> capabilities.
> - Add "active" hook for FP regset
> - Remove dangerous WARN_ON from KVM, replaced with an additional
> check to make sure that the FP/SIMD is always trapped.
> - Added tags from Catalin, Marc
>
> Suzuki K Poulose (7):
> arm64: Introduce system_capabilities_finalized() marker
> arm64: fpsimd: Make sure SVE setup is complete before SIMD is used
> arm64: cpufeature: Fix the type of no FP/SIMD capability
> arm64: cpufeature: Set the FP/SIMD compat HWCAP bits properly
> arm64: ptrace: nofpsimd: Fail FP/SIMD regset operations
> arm64: signal: nofpsimd: Handle fp/simd context for signal frames
> arm64: nofpsmid: Handle TIF_FOREIGN_FPSTATE flag cleanly
>

For the series,

Reviewed-by: Ard Biesheuvel <ardb@xxxxxxxxxx>


> arch/arm64/include/asm/cpufeature.h | 5 +++
> arch/arm64/include/asm/kvm_host.h | 2 +-
> arch/arm64/include/asm/simd.h | 8 +++-
> arch/arm64/kernel/cpufeature.c | 67 +++++++++++++++++++----------
> arch/arm64/kernel/fpsimd.c | 30 +++++++++++--
> arch/arm64/kernel/process.c | 2 +-
> arch/arm64/kernel/ptrace.c | 21 +++++++++
> arch/arm64/kernel/signal.c | 6 ++-
> arch/arm64/kernel/signal32.c | 4 +-
> arch/arm64/kvm/hyp/switch.c | 10 ++++-
> 10 files changed, 121 insertions(+), 34 deletions(-)
>
> --
> 2.24.1
>