Skip to content

Commit 31cd31c

Browse files
Fushuai Wanghansendc
authored andcommitted
x86/fpu: Fix NULL dereference in avx512_status()
Problem ------- With CONFIG_X86_DEBUG_FPU enabled, reading /proc/[kthread]/arch_status causes a warning and a NULL pointer dereference. This is because the AVX-512 timestamp code uses x86_task_fpu() but doesn't check it for NULL. CONFIG_X86_DEBUG_FPU addles that function for kernel threads (PF_KTHREAD specifically), making it return NULL. The point of the warning was to ensure that kernel threads only access task->fpu after going through kernel_fpu_begin()/_end(). Note: all kernel tasks exposed in /proc have a valid task->fpu. Solution -------- One option is to silence the warning and check for NULL from x86_task_fpu(). However, that warning is fairly fresh and seems like a defense against misuse of the FPU state in kernel threads. Instead, stop outputting AVX-512_elapsed_ms for kernel threads altogether. The data was garbage anyway because avx512_timestamp is only updated for user threads, not kernel threads. If anyone ever wants to track kernel thread AVX-512 use, they can come back later and do it properly, separate from this bug fix. [ dhansen: mostly rewrite changelog ] Fixes: 22aafe3 ("x86/fpu: Remove init_task FPU state dependencies, add debugging warning for PF_KTHREAD tasks") Co-developed-by: Sohil Mehta <[email protected]> Signed-off-by: Sohil Mehta <[email protected]> Signed-off-by: Fushuai Wang <[email protected]> Signed-off-by: Dave Hansen <[email protected]> Cc: [email protected] Link: https://lore.kernel.org/all/20250811185044.2227268-1-sohil.mehta%40intel.com
1 parent 4fa7d88 commit 31cd31c

File tree

1 file changed

+10
-9
lines changed

1 file changed

+10
-9
lines changed

arch/x86/kernel/fpu/xstate.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1881,19 +1881,20 @@ long fpu_xstate_prctl(int option, unsigned long arg2)
18811881
#ifdef CONFIG_PROC_PID_ARCH_STATUS
18821882
/*
18831883
* Report the amount of time elapsed in millisecond since last AVX512
1884-
* use in the task.
1884+
* use in the task. Report -1 if no AVX-512 usage.
18851885
*/
18861886
static void avx512_status(struct seq_file *m, struct task_struct *task)
18871887
{
1888-
unsigned long timestamp = READ_ONCE(x86_task_fpu(task)->avx512_timestamp);
1889-
long delta;
1888+
unsigned long timestamp;
1889+
long delta = -1;
18901890

1891-
if (!timestamp) {
1892-
/*
1893-
* Report -1 if no AVX512 usage
1894-
*/
1895-
delta = -1;
1896-
} else {
1891+
/* AVX-512 usage is not tracked for kernel threads. Don't report anything. */
1892+
if (task->flags & (PF_KTHREAD | PF_USER_WORKER))
1893+
return;
1894+
1895+
timestamp = READ_ONCE(x86_task_fpu(task)->avx512_timestamp);
1896+
1897+
if (timestamp) {
18971898
delta = (long)(jiffies - timestamp);
18981899
/*
18991900
* Cap to LONG_MAX if time difference > LONG_MAX

0 commit comments

Comments
 (0)