Patch "arm64/fpsimd: Avoid erroneous elide of user state reload" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    arm64/fpsimd: Avoid erroneous elide of user state reload

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     arm64-fpsimd-avoid-erroneous-elide-of-user-state-rel.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 0180bc16b0f2c38cf9215f40fdca39302bc242da
Author: Ard Biesheuvel <ardb@xxxxxxxxxx>
Date:   Wed May 22 11:13:36 2024 +0200

    arm64/fpsimd: Avoid erroneous elide of user state reload
    
    [ Upstream commit e92bee9f861b466c676f0200be3e46af7bc4ac6b ]
    
    TIF_FOREIGN_FPSTATE is a 'convenience' flag that should reflect whether
    the current CPU holds the most recent user mode FP/SIMD state of the
    current task. It combines two conditions:
    - whether the current CPU's FP/SIMD state belongs to the task;
    - whether that state is the most recent associated with the task (as a
      task may have executed on other CPUs as well).
    
    When a task is scheduled in and TIF_KERNEL_FPSTATE is set, it means the
    task was in a kernel mode NEON section when it was scheduled out, and so
    the kernel mode FP/SIMD state is restored. Since this implies that the
    current CPU is *not* holding the most recent user mode FP/SIMD state of
    the current task, the TIF_FOREIGN_FPSTATE flag is set too, so that the
    user mode FP/SIMD state is reloaded from memory when returning to
    userland.
    
    However, the task may be scheduled out after completing the kernel mode
    NEON section, but before returning to userland. When this happens, the
    TIF_FOREIGN_FPSTATE flag will not be preserved, but will be set as usual
    the next time the task is scheduled in, and will be based on the above
    conditions.
    
    This means that, rather than setting TIF_FOREIGN_FPSTATE when scheduling
    in a task with TIF_KERNEL_FPSTATE set, the underlying state should be
    updated so that TIF_FOREIGN_FPSTATE will assume the expected value as a
    result.
    
    So instead, call fpsimd_flush_cpu_state(), which takes care of this.
    
    Closes: https://lore.kernel.org/all/cb8822182231850108fa43e0446a4c7f@xxxxxxxxxx
    Reported-by: Johannes Nixdorf <mixi@xxxxxxxxxxxxx>
    Fixes: aefbab8e77eb ("arm64: fpsimd: Preserve/restore kernel mode NEON at context switch")
    Cc: Mark Brown <broonie@xxxxxxxxxx>
    Cc: Dave Martin <Dave.Martin@xxxxxxx>
    Cc: Janne Grunau <j@xxxxxxxxxx>
    Cc: stable@xxxxxxxxxxxxxxx
    Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx>
    Tested-by: Janne Grunau <j@xxxxxxxxxx>
    Tested-by: Johannes Nixdorf <mixi@xxxxxxxxxxxxx>
    Reviewed-by: Mark Brown <broonie@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240522091335.335346-2-ardb+git@xxxxxxxxxx
    Signed-off-by: Will Deacon <will@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index aa695057c93dd..55963fa64dec8 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c
@@ -1560,6 +1560,27 @@ static void fpsimd_save_kernel_state(struct task_struct *task)
 	fpsimd_save_state(&task->thread.kernel_fpsimd_state);
 }
 
+/*
+ * Invalidate any task's FPSIMD state that is present on this cpu.
+ * The FPSIMD context should be acquired with get_cpu_fpsimd_context()
+ * before calling this function.
+ */
+static void fpsimd_flush_cpu_state(void)
+{
+	WARN_ON(!system_supports_fpsimd());
+	__this_cpu_write(fpsimd_last_state.st, NULL);
+
+	/*
+	 * Leaving streaming mode enabled will cause issues for any kernel
+	 * NEON and leaving streaming mode or ZA enabled may increase power
+	 * consumption.
+	 */
+	if (system_supports_sme())
+		sme_smstop();
+
+	set_thread_flag(TIF_FOREIGN_FPSTATE);
+}
+
 void fpsimd_thread_switch(struct task_struct *next)
 {
 	bool wrong_task, wrong_cpu;
@@ -1577,7 +1598,7 @@ void fpsimd_thread_switch(struct task_struct *next)
 
 	if (test_tsk_thread_flag(next, TIF_KERNEL_FPSTATE)) {
 		fpsimd_load_kernel_state(next);
-		set_tsk_thread_flag(next, TIF_FOREIGN_FPSTATE);
+		fpsimd_flush_cpu_state();
 	} else {
 		/*
 		 * Fix up TIF_FOREIGN_FPSTATE to correctly describe next's
@@ -1856,27 +1877,6 @@ void fpsimd_flush_task_state(struct task_struct *t)
 	barrier();
 }
 
-/*
- * Invalidate any task's FPSIMD state that is present on this cpu.
- * The FPSIMD context should be acquired with get_cpu_fpsimd_context()
- * before calling this function.
- */
-static void fpsimd_flush_cpu_state(void)
-{
-	WARN_ON(!system_supports_fpsimd());
-	__this_cpu_write(fpsimd_last_state.st, NULL);
-
-	/*
-	 * Leaving streaming mode enabled will cause issues for any kernel
-	 * NEON and leaving streaming mode or ZA enabled may increase power
-	 * consumption.
-	 */
-	if (system_supports_sme())
-		sme_smstop();
-
-	set_thread_flag(TIF_FOREIGN_FPSTATE);
-}
-
 /*
  * Save the FPSIMD state to memory and invalidate cpu view.
  * This function must be called with preemption disabled.




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux