[PATCH 05/18] arm64: fpsimd: Fold sve_init_regs() into do_sve_acc()
Vladimir Murzin
vladimir.murzin at arm.com
Wed May 27 05:05:30 PDT 2026
On 5/21/26 14:25, Mark Rutland wrote:
> For historical reasons, do_sve_acc() is structurally different from
> do_sme_acc(), and the logic to convert the task from FPSIMD to SVE is
> out-of-line in sve_init_regs(). We only use sve_init_regs() within
> do_sme_acc(), so it's not necessary for this to be a separate function.
>
> Fold sve_init_regs() into do_sve_acc(), and simplify the associated
> comments. This makes do_sve_acc() structurally similar to do_sme_acc(),
> making it easier to see similarities and differences.
>
> There should be no functional change as a result of this patch.
>
> Signed-off-by: Mark Rutland <mark.rutland at arm.com>
> Cc: Catalin Marinas <catalin.marinas at arm.com>
> Cc: Fuad Tabba <tabba at google.com>
> Cc: James Morse <james.morse at arm.com>
> Cc: Marc Zyngier <maz at kernel.org>
> Cc: Mark Brown <broonie at kernel.org>
> Cc: Oliver Upton <oupton at kernel.org>
> Cc: Will Deacon <will at kernel.org>
> ---
> arch/arm64/kernel/fpsimd.c | 48 ++++++++++++++------------------------
> 1 file changed, 17 insertions(+), 31 deletions(-)
>
> diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
> index 60a45d600b460..a8395cb303344 100644
> --- a/arch/arm64/kernel/fpsimd.c
> +++ b/arch/arm64/kernel/fpsimd.c
> @@ -1293,31 +1293,6 @@ void sme_suspend_exit(void)
>
> #endif /* CONFIG_ARM64_SME */
>
> -static void sve_init_regs(void)
> -{
> - /*
> - * Convert the FPSIMD state to SVE, zeroing all the state that
> - * is not shared with FPSIMD. If (as is likely) the current
> - * state is live in the registers then do this there and
> - * update our metadata for the current task including
> - * disabling the trap, otherwise update our in-memory copy.
> - * We are guaranteed to not be in streaming mode, we can only
> - * take a SVE trap when not in streaming mode and we can't be
> - * in streaming mode when taking a SME trap.
> - */
> - if (!test_thread_flag(TIF_FOREIGN_FPSTATE)) {
> - unsigned long vq_minus_one =
> - sve_vq_from_vl(task_get_sve_vl(current)) - 1;
> - sve_set_vq(vq_minus_one);
> - sve_flush_live(true, vq_minus_one);
> - fpsimd_bind_task_to_cpu();
> - } else {
> - fpsimd_to_sve(current);
> - current->thread.fp_type = FP_STATE_SVE;
> - fpsimd_flush_task_state(current);
> - }
> -}
> -
> /*
> * Trapped SVE access
> *
> @@ -1349,13 +1324,24 @@ void do_sve_acc(unsigned long esr, struct pt_regs *regs)
> WARN_ON(1); /* SVE access shouldn't have trapped */
>
> /*
> - * Even if the task can have used streaming mode we can only
> - * generate SVE access traps in normal SVE mode and
> - * transitioning out of streaming mode may discard any
> - * streaming mode state. Always clear the high bits to avoid
> - * any potential errors tracking what is properly initialised.
> + * Convert the FPSIMD state to SVE. Stale SVE state can be present in
> + * registers or memory, so we must zero all state that is not shared
> + * with FPSIMD.
> + *
> + * SVE traps cannot be taken from streaming mode, so there cannot be
> + * any effective streaming mode SVE state.
> */
> - sve_init_regs();
> + if (!test_thread_flag(TIF_FOREIGN_FPSTATE)) {
> + unsigned long vq_minus_one =
> + sve_vq_from_vl(task_get_sve_vl(current)) - 1;
> + sve_set_vq(vq_minus_one);
> + sve_flush_live(true, vq_minus_one);
> + fpsimd_bind_task_to_cpu();
> + } else {
> + fpsimd_to_sve(current);
> + current->thread.fp_type = FP_STATE_SVE;
> + fpsimd_flush_task_state(current);
> + }
>
> put_cpu_fpsimd_context();
> }
> -- 2.30.2
>
FWIW,
Reviewed-by: Vladimir Murzin <vladimir.murzin at arm.com>
More information about the linux-arm-kernel
mailing list