diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c index fa88bf6ccce0..a7bac5fe2994 100644 --- a/kernel/sched/psi.c +++ b/kernel/sched/psi.c @@ -972,6 +972,12 @@ void psi_cgroup_free(struct cgroup *cgroup) return; cancel_delayed_work_sync(&cgroup->psi.avgs_work); + /* + * A psi_schedule_poll_work() call racing the last trigger's + * destruction may have re-armed the timer after psi_trigger_destroy() + * deleted it. Spurious firing while the group is alive is harmless. + */ + timer_shutdown_sync(&cgroup->psi.poll_timer); free_percpu(cgroup->psi.pcpu); /* All triggers must be removed by now */ WARN_ONCE(cgroup->psi.poll_states, "psi: trigger leak\n");