[PATCH v3 0/2] x86/fpu: Fix dynamic fpstate leak on exec()
From: Guixiong Wei
Date: Mon Oct 26 2026 - 23:45:12 EST
An exec() after using an XFD-controlled xfeature leaks the dynamically
allocated fpstate. Fix the cleanup in fpstate_reset() and add an AMX
regression selftest.
The selftest reports FAIL on an unfixed kernel (verified 10/10 FAILs
on 7.1.3 with the leak reproducer present) and OK with the fix applied.
Changes since v2:
- Free dynamic state at the start of fpstate_reset(), keeping the
fpstate_free() interface unchanged. Clear the inherited fpstate
pointer in fpu_clone() before resetting it.
- Replace nested self-exec with a parent fork()/exec() loop.
- Add a pipe-synchronised pre-flight check that confirms the dynamic
allocation is observable via /proc/vmallocinfo before measuring the
post-exec() delta. Without that gate "no new entries" is ambiguous
between "freed" and "never observed" and would silently PASS on
kernels where the allocation is not reachable. /proc/vmallocinfo is
the only user-visible signal for a leaked post-exec() fpstate (it
has no task scope once the task is gone).
- Compare the set of allocation start addresses in /proc/vmallocinfo
before and after the loop; addresses present only in the "after"
snapshot count as new allocations that outlived their task. This
compares allocation identity directly, so unrelated vmalloc churn
elsewhere does not change the result. SKIP if any matching entry's
address is hidden (kptr_restrict) because the diff can no longer
distinguish allocations.
- Report leak failures without preventing subsequent subtests from
running, and simplify the commit messages.
v2: https://lore.kernel.org/r/cover.1791428412.git.weiguixiong@xxxxxxxxxxxxx
v1: https://lore.kernel.org/r/20260929151013.81562-2-weiguixiong@xxxxxxxxxxxxx
Guixiong Wei (2):
x86/fpu: Fix memory leak with dynamic fpstate and exec()
selftests/x86/amx: Test dynamic fpstate cleanup across exec()
arch/x86/kernel/fpu/core.c | 5 +
tools/testing/selftests/x86/amx.c | 251 +++++++++++++++++++++++++++++-
2 files changed, 254 insertions(+), 2 deletions(-)
base-commit: 72d3fcf802c45d00b300f25b848a93c3a2bd7c7e
--
2.55.0