[PATCH 3/3] sched/psi: Avoid clobbering rtpoll_scheduled during teardown

From: Guopeng Zhang

Date: Fri Jul 17 2026 - 05:16:07 EST


From: Guopeng Zhang <zhangguopeng@xxxxxxxxxx>

Last-trigger teardown has to drop rtpoll_trigger_lock before calling
kthread_stop() because the worker takes the same lock. A new trigger
can therefore install a replacement worker and schedule its timer
before the old worker has stopped.

Teardown currently clears rtpoll_scheduled only after kthread_stop()
returns. That late clear can overwrite state installed for the
replacement, leaving rtpoll_scheduled clear while its timer is pending.
The next task change can then rearm the timer unnecessarily.

Reset the flag after draining the old timer while still holding
rtpoll_trigger_lock, before a replacement can be published, and leave it
untouched after unlocking.

Fixes: 710ffe671e01 ("sched/psi: Stop relying on timer_pending() for poll_work rescheduling")
Signed-off-by: Guopeng Zhang <zhangguopeng@xxxxxxxxxx>
---
kernel/sched/psi.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c
index db9c56fa8923..bec329fafb4d 100644
--- a/kernel/sched/psi.c
+++ b/kernel/sched/psi.c
@@ -1496,6 +1496,7 @@ void psi_trigger_destroy(struct psi_trigger *t)
*/
synchronize_rcu();
timer_delete_sync(&group->rtpoll_timer);
+ atomic_set(&group->rtpoll_scheduled, 0);
}
}
mutex_unlock(&group->rtpoll_trigger_lock);
@@ -1515,7 +1516,6 @@ void psi_trigger_destroy(struct psi_trigger *t)
* can no longer be found through group->rtpoll_task.
*/
kthread_stop(task_to_destroy);
- atomic_set(&group->rtpoll_scheduled, 0);
}
kfree(t);
}
--
2.43.0