Patch "arm64: fpsimd: Implement lazy restore for kernel mode FPSIMD" 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: Implement lazy restore for kernel mode FPSIMD

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-implement-lazy-restore-for-kernel-mode-.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 afeeeb2dbfdded9651e5b4e01083c2d1c114ea82
Author: Ard Biesheuvel <ardb@xxxxxxxxxx>
Date:   Fri Dec 8 12:32:22 2023 +0100

    arm64: fpsimd: Implement lazy restore for kernel mode FPSIMD
    
    [ Upstream commit 2632e25217696712681dd1f3ecc0d71624ea3b23 ]
    
    Now that kernel mode FPSIMD state is context switched along with other
    task state, we can enable the existing logic that keeps track of which
    task's FPSIMD state the CPU is holding in its registers. If it is the
    context of the task that we are switching to, we can elide the reload of
    the FPSIMD state from memory.
    
    Note that we also need to check whether the FPSIMD state on this CPU is
    the most recent: if a task gets migrated away and back again, the state
    in memory may be more recent than the state in the CPU. So add another
    CPU id field to task_struct to keep track of this. (We could reuse the
    existing CPU id field used for user mode context, but that might result
    in user state to be discarded unnecessarily, given that two distinct
    CPUs could be holding the most recent user mode state and the most
    recent kernel mode state)
    
    Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx>
    Reviewed-by: Mark Brown <broonie@xxxxxxxxxx>
    Acked-by: Mark Rutland <mark.rutland@xxxxxxx>
    Link: https://lore.kernel.org/r/20231208113218.3001940-9-ardb@xxxxxxxxxx
    Signed-off-by: Will Deacon <will@xxxxxxxxxx>
    Stable-dep-of: b8995a184170 ("Revert "arm64: fpsimd: Implement lazy restore for kernel mode FPSIMD"")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h
index ce6eebd6c08bd..5b0a04810b236 100644
--- a/arch/arm64/include/asm/processor.h
+++ b/arch/arm64/include/asm/processor.h
@@ -169,6 +169,7 @@ struct thread_struct {
 	struct debug_info	debug;		/* debugging */
 
 	struct user_fpsimd_state	kernel_fpsimd_state;
+	unsigned int			kernel_fpsimd_cpu;
 #ifdef CONFIG_ARM64_PTR_AUTH
 	struct ptrauth_keys_user	keys_user;
 #ifdef CONFIG_ARM64_PTR_AUTH_KERNEL
diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index aa695057c93dd..92cb6dd1cfc1a 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c
@@ -1552,12 +1552,30 @@ void do_fpsimd_exc(unsigned long esr, struct pt_regs *regs)
 
 static void fpsimd_load_kernel_state(struct task_struct *task)
 {
+	struct cpu_fp_state *last = this_cpu_ptr(&fpsimd_last_state);
+
+	/*
+	 * Elide the load if this CPU holds the most recent kernel mode
+	 * FPSIMD context of the current task.
+	 */
+	if (last->st == &task->thread.kernel_fpsimd_state &&
+	    task->thread.kernel_fpsimd_cpu == smp_processor_id())
+		return;
+
 	fpsimd_load_state(&task->thread.kernel_fpsimd_state);
 }
 
 static void fpsimd_save_kernel_state(struct task_struct *task)
 {
+	struct cpu_fp_state cpu_fp_state = {
+		.st		= &task->thread.kernel_fpsimd_state,
+		.to_save	= FP_STATE_FPSIMD,
+	};
+
 	fpsimd_save_state(&task->thread.kernel_fpsimd_state);
+	fpsimd_bind_state_to_cpu(&cpu_fp_state);
+
+	task->thread.kernel_fpsimd_cpu = smp_processor_id();
 }
 
 void fpsimd_thread_switch(struct task_struct *next)




[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