• Ard Biesheuvel's avatar
    arm64: fpsimd: Preserve/restore kernel mode NEON at context switch · aefbab8e
    Ard Biesheuvel authored
    Currently, the FPSIMD register file is not preserved and restored along
    with the general registers on exception entry/exit or context switch.
    For this reason, we disable preemption when enabling FPSIMD for kernel
    mode use in task context, and suspend the processing of softirqs so that
    there are no concurrent uses in the kernel. (Kernel mode FPSIMD may not
    be used at all in other contexts).
    
    Disabling preemption while doing CPU intensive work on inputs of
    potentially unbounded size is bad for real-time performance, which is
    why we try and ensure that SIMD crypto code does not operate on more
    than ~4k at a time, which is an arbitrary limit and requires assembler
    code to implement efficiently.
    
    We can avoid the need for disabling preemption if we can ensure that any
    in-kernel users of the NEON will not lose the FPSIMD register state
    across a context switch. And given that disabling softirqs implicitly
    disables preemption as well, we will also have to ensure that a softirq
    that runs code using FPSIMD can safely interrupt an in-kernel user.
    
    So introduce a thread_info flag TIF_KERNEL_FPSTATE, and modify the
    context switch hook for FPSIMD to preserve and restore the kernel mode
    FPSIMD to/from struct thread_struct when it is set. This avoids any
    scheduling blackouts due to prolonged use of FPSIMD in kernel mode,
    without the need for manual yielding.
    
    In order to support softirq processing while FPSIMD is being used in
    kernel task context, use the same flag to decide whether the kernel mode
    FPSIMD state needs to be preserved and restored before allowing FPSIMD
    to be used in softirq context.
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Reviewed-by: default avatarMark Brown <broonie@kernel.org>
    Reviewed-by: default avatarMark Rutland <mark.rutland@arm.com>
    Link: https://lore.kernel.org/r/20231208113218.3001940-8-ardb@google.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
    aefbab8e
fpsimd.c 57.6 KB