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

From: Suren Baghdasaryan

Date: Mon Jul 27 2026 - 01:54:25 EST


On Fri, Jul 17, 2026 at 2:15 AM Guopeng Zhang <guopeng.zhang@xxxxxxxxx> wrote:
>
> 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.

Makes sense.

>
> Fixes: 710ffe671e01 ("sched/psi: Stop relying on timer_pending() for poll_work rescheduling")
> Signed-off-by: Guopeng Zhang <zhangguopeng@xxxxxxxxxx>

Acked-by: Suren Baghdasaryan <surenb@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