PT-2026-90305 · Linux · Linux

CVE-2026-89589

·

Published

2026-09-11

·

Updated

2026-09-11

None

No severity ratings or metrics are available. When they are, we'll update the corresponding info on the page.
In the Linux kernel, the following vulnerability has been resolved:
acpi/apei/ghes: Use raw spinlock t for CXL CPER work locks
The CXL CPER work registration and unregistration helpers acquire cxl cper work lock and cxl cper prot err work lock with a spinlock guard(), which leaves local interrupts enabled. The corresponding post paths (cxl cper post event(), cxl cper post prot err()) execute in hard IRQ context (they are called from the GHES error notification path) and acquire the same locks with an irqsave guard().
If a CPU is holding one of these locks via a spinlock guard() when a GHES interrupt arrives on the same CPU, the IRQ handler spins on the held lock waiting for it to release, while the lock holder is preempted by the IRQ. The result is a deadlock.
Convert both locks from spinlock t to raw spinlock t and use guard() at all call sites. On PREEMPT RT kernels spinlock t is backed by rt mutex and sleeping from hard IRQ context is not permitted; raw spinlock t is safe in both contexts.
Add WARN ONCE to both register functions to surface double-registration bugs at runtime.
Restructure both unregister functions to clear the global work pointer under the lock before calling cancel work sync(), closing the window where a CPER interrupt could schedule work on a pointer about to be freed. Add kfifo reset() after cancel work sync() so stale entries are not replayed on next module load.
Both kfifos are single-consumer: only one work struct is registered at a time, enforced by the WARN ONCE guard in the register functions. kfifo reset() is safe outside the lock because cancel work sync() has already quiesced the consumer, and no new consumer can register until the current module exit completes and a fresh module init runs.
Remove the redundant cancel work sync() call from cxl ras exit() and cxl pci driver exit(). The CPER unregister functions now quiesce the work internally.
Found an issue in the description? Have something to add? Feel free to write us 👾

Related Identifiers

CVE-2026-89589

Affected Products

Linux