]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
arm64/fpsimd: Remove redundant SVE trap manipulation
authorMark Rutland <mark.rutland@arm.com>
Wed, 9 Apr 2025 16:40:00 +0000 (17:40 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Wed, 9 Apr 2025 17:06:30 +0000 (18:06 +0100)
When task_fpsimd_load() loads the saved FPSIMD/SVE/SME state, it
configures EL0 SVE traps by calling sve_user_{enable,disable}(). This is
unnecessary, and this is suspicious/confusing as task_fpsimd_load() does
not configure EL0 SME traps.

All calls to task_fpsimd_load() are followed by a call to
fpsimd_bind_task_to_cpu(), where the latter configures traps for SVE and
SME dependent upon the current values of TIF_SVE and TIF_SME, overriding
any trap configuration performed by task_fpsimd_load().

The calls to sve_user_{enable,disable}() calls in task_fpsimd_load()
have been redundant (though benign) since they were introduced in
commit:

  a0136be443d51803 ("arm64/fpsimd: Load FP state based on recorded data type")

Remove the unnecessary and confusing SVE trap manipulation.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Mark Brown <broonie@kernel.org>
Cc: Will Deacon <will@kernel.org>
Reviewed-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20250409164010.3480271-4-mark.rutland@arm.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/kernel/fpsimd.c

index 1391a491f2226a2ced41aa4d5852a8768c452b0a..757445d72e5b731a0fa24eeb3287d55a46b7114b 100644 (file)
@@ -366,13 +366,11 @@ static void task_fpsimd_load(void)
                switch (current->thread.fp_type) {
                case FP_STATE_FPSIMD:
                        /* Stop tracking SVE for this task until next use. */
-                       if (test_and_clear_thread_flag(TIF_SVE))
-                               sve_user_disable();
+                       clear_thread_flag(TIF_SVE);
                        break;
                case FP_STATE_SVE:
-                       if (!thread_sm_enabled(&current->thread) &&
-                           !WARN_ON_ONCE(!test_and_set_thread_flag(TIF_SVE)))
-                               sve_user_enable();
+                       if (!thread_sm_enabled(&current->thread))
+                               WARN_ON_ONCE(!test_and_set_thread_flag(TIF_SVE));
 
                        if (test_thread_flag(TIF_SVE))
                                sve_set_vq(sve_vq_from_vl(task_get_sve_vl(current)) - 1);