Patch "x86/fpu: Exclude dynamic states from init_fpstate" has been added to the 6.0-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

    x86/fpu: Exclude dynamic states from init_fpstate

to the 6.0-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:
     x86-fpu-exclude-dynamic-states-from-init_fpstate.patch
and it can be found in the queue-6.0 subdirectory.

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



commit 12a8e22274e22a16b615eec0c89608d7b577e5ce
Author: Chang S. Bae <chang.seok.bae@xxxxxxxxx>
Date:   Wed Aug 24 12:12:23 2022 -0700

    x86/fpu: Exclude dynamic states from init_fpstate
    
    [ Upstream commit a401f45e38754953c9d402f8b3bc965707eecc91 ]
    
    == Background ==
    
    The XSTATE init code initializes all enabled and supported components.
    Then, the init states are saved in the init_fpstate buffer that is
    statically allocated in about one page.
    
    The AMX TILE_DATA state is large (8KB) but its init state is zero. And the
    feature comes only with the compacted format with these established
    dependencies: AMX->XFD->XSAVES. So this state is excludable from
    init_fpstate.
    
    == Problem ==
    
    But the buffer is formatted to include that large state. Then, this can be
    the cause of a noisy splat like the below.
    
    This came from XRSTORS for the task with init_fpstate in its XSAVE buffer.
    It is reproducible on AMX systems when the running kernel is built with
    CONFIG_DEBUG_PAGEALLOC=y and CONFIG_DEBUG_PAGEALLOC_ENABLE_DEFAULT=y:
    
     Bad FPU state detected at restore_fpregs_from_fpstate+0x57/0xd0, reinitializing FPU registers.
     ...
     RIP: 0010:restore_fpregs_from_fpstate+0x57/0xd0
      ? restore_fpregs_from_fpstate+0x45/0xd0
      switch_fpu_return+0x4e/0xe0
      exit_to_user_mode_prepare+0x17b/0x1b0
      syscall_exit_to_user_mode+0x29/0x40
      do_syscall_64+0x67/0x80
      ? do_syscall_64+0x67/0x80
      ? exc_page_fault+0x86/0x180
      entry_SYSCALL_64_after_hwframe+0x63/0xcd
    
    == Solution ==
    
    Adjust init_fpstate to exclude dynamic states. XRSTORS from init_fpstate
    still initializes those states when their bits are set in the
    requested-feature bitmap.
    
    Fixes: 2308ee57d93d ("x86/fpu/amx: Enable the AMX feature in 64-bit mode")
    Reported-by: Lin X Wang <lin.x.wang@xxxxxxxxx>
    Signed-off-by: Chang S. Bae <chang.seok.bae@xxxxxxxxx>
    Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
    Tested-by: Lin X Wang <lin.x.wang@xxxxxxxxx>
    Link: https://lore.kernel.org/r/20220824191223.1248-4-chang.seok.bae@xxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c
index f5ef78633b4c..e77cabfa802f 100644
--- a/arch/x86/kernel/fpu/xstate.c
+++ b/arch/x86/kernel/fpu/xstate.c
@@ -857,9 +857,12 @@ void __init fpu__init_system_xstate(unsigned int legacy_size)
 	update_regset_xstate_info(fpu_user_cfg.max_size,
 				  fpu_user_cfg.max_features);
 
-	/* Bring init_fpstate size and features up to date */
-	init_fpstate.size		= fpu_kernel_cfg.max_size;
-	init_fpstate.xfeatures		= fpu_kernel_cfg.max_features;
+	/*
+	 * init_fpstate excludes dynamic states as they are large but init
+	 * state is zero.
+	 */
+	init_fpstate.size		= fpu_kernel_cfg.default_size;
+	init_fpstate.xfeatures		= fpu_kernel_cfg.default_features;
 
 	if (init_fpstate.size > sizeof(init_fpstate.regs)) {
 		pr_warn("x86/fpu: init_fpstate buffer too small (%zu < %d), disabling XSAVE\n",



[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