]> www.infradead.org Git - users/hch/misc.git/commit
x86/fred: Fix the FRED RSP0 MSR out of sync with its per-CPU cache
authorXin Li (Intel) <xin@zytor.com>
Fri, 10 Jan 2025 17:46:39 +0000 (09:46 -0800)
committerDave Hansen <dave.hansen@linux.intel.com>
Tue, 14 Jan 2025 22:16:36 +0000 (14:16 -0800)
commitde31b3cd706347044e1a57d68c3a683d58e8cca4
tree856ffdd2b3454e5e4fc2c566ed66b2cbec3e016b
parenta9bbe341333109465605e8733bab0b573cddcc8c
x86/fred: Fix the FRED RSP0 MSR out of sync with its per-CPU cache

The FRED RSP0 MSR is only used for delivering events when running
userspace.  Linux leverages this property to reduce expensive MSR
writes and optimize context switches.  The kernel only writes the
MSR when about to run userspace *and* when the MSR has actually
changed since the last time userspace ran.

This optimization is implemented by maintaining a per-CPU cache of
FRED RSP0 and then checking that against the value for the top of
current task stack before running userspace.

However cpu_init_fred_exceptions() writes the MSR without updating
the per-CPU cache.  This means that the kernel might return to
userspace with MSR_IA32_FRED_RSP0==0 when it needed to point to the
top of current task stack.  This would induce a double fault (#DF),
which is bad.

A context switch after cpu_init_fred_exceptions() can paper over
the issue since it updates the cached value.  That evidently
happens most of the time explaining how this bug got through.

Fix the bug through resynchronizing the FRED RSP0 MSR with its
per-CPU cache in cpu_init_fred_exceptions().

Fixes: fe85ee391966 ("x86/entry: Set FRED RSP0 on return to userspace instead of context switch")
Signed-off-by: Xin Li (Intel) <xin@zytor.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Acked-by: Dave Hansen <dave.hansen@linux.intel.com>
Cc:stable@vger.kernel.org
Link: https://lore.kernel.org/all/20250110174639.1250829-1-xin%40zytor.com
arch/x86/kernel/fred.c