Chang S. Bae a401f45e38 x86/fpu: Exclude dynamic states from init_fpstate
== 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@intel.com>
Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Lin X Wang <lin.x.wang@intel.com>
Link: https://lore.kernel.org/r/20220824191223.1248-4-chang.seok.bae@intel.com
2022-10-17 15:44:25 +02:00
..
2022-03-15 10:32:40 +01:00
2022-09-26 10:13:16 -07:00
2020-11-24 16:47:49 +01:00
2021-11-02 22:22:13 -07:00
2022-04-19 17:14:09 -07:00
2022-08-05 09:41:12 -07:00
2022-07-01 11:11:34 +02:00
2022-06-27 10:34:00 +02:00
2022-04-07 08:27:51 -07:00
2022-08-02 15:21:18 -07:00
2021-03-18 15:31:53 +01:00
2022-06-20 06:22:04 -04:00
2022-03-15 10:32:36 +01:00
2021-12-01 00:06:43 +01:00
2022-04-14 14:09:43 +02:00
2021-03-18 15:31:53 +01:00
2022-05-19 19:30:31 +02:00
2022-08-25 15:54:03 +02:00
2022-04-14 14:09:43 +02:00
2022-09-19 17:51:53 -07:00
2022-02-25 09:36:05 +01:00
2020-08-20 13:12:58 +02:00
2022-09-26 19:46:16 -07:00
2020-07-27 14:31:07 -04:00
2021-10-25 23:02:36 -04:00
2022-09-26 10:13:16 -07:00
2022-04-14 14:09:43 +02:00