CVE-2026-74594: sched/psi: Shut down rtpoll_timer in psi_cgroup_free()
In the Linux kernel, the following vulnerability has been resolved:
sched/psi: Shut down rtpolltimer in psicgroupfree()
psischedulertpollwork() is called locklessly from the scheduler hotpath and can race psitriggerdestroy() taking down the last rtpoll trigger under rtpolltriggerlock:
psischedulertpollwork() psitriggerdestroy()
rcureadlock(); task = rcudereference(rtpolltask); rcuassignpointer(rtpolltask, NULL); timerdelete(&rtpolltimer); modtimer(&rtpolltimer, ...); rcureadunlock(); synchronizercu(); kthreadstop(tasktodestroy);
The group can then be freed with the re-armed timer still pending, and polltimerfn() runs on freed memory.
461daba06bdc ("psi: eliminate kthreadworker from psi trigger scheduling mechanism") deleted the timer synchronously after the synchronizercu(), which prevented this but raced trigger creation instead: the deletion could cancel the timer that a new trigger set armed during the grace period and, as creation also reinitialized the timer at the time, corrupt it. 8f91efd870ea ("psi: Fix race between psitriggercreate/destroy") moved the initialization into groupinit() and the deletion into the locked section, trading the creation races for the window above.
Neither placement in the destruction path works. A pending timer firing while the group is alive is harmless though. polltimerfn() just wakes the rtpoll waitqueue and doesn't re-arm itself. Bind the timer to the group's lifetime instead and shut it down in psicgroupfree(). Nothing can arm it by then. timershutdownsync() because the timer is never armed again.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade to a fixed release to a version that resolves this vulnerability.
Fixed in 6.6.152.1-1
Event History
Frequently Asked Questions
Which systems are exposed to this race condition?
Systems are exposed when PSI cgroup real-time polling triggers are in use and the last rtpoll trigger is destroyed while scheduler-path activity can still schedule rtpoll work. The race can leave the rtpoll timer re-armed after the associated PSI group is freed.
What is the resulting failure mode?
The pending timer can later invoke poll_timer_fn() using memory belonging to a freed PSI group. This is a use-after-free condition.