From f28a439a5aeb6f0bde49eb89c2bd0c1498104675 Mon Sep 17 00:00:00 2001 From: Patrick Daly Date: Mon, 17 Jun 2019 15:40:01 -0700 Subject: [PATCH] psi: Use deferrable psi_avgs_work The logic for psi_avgs_work to not reschedule itself does not appear to work properly. 1) psi_avgs_work detects itself as a running task due to accounting for current states in get_recent_times(). 2) Drivers with self-rescheduling deferrable work with a period less than that of psi_avgs_work will always run when psi_avgs_work runs. This causes psi_avgs_work to retrigger. Make psi_avgs_work deferrable to avoid this loop. Change-Id: I90edc5d3cce87ada803f549f417cd0108ef2017f Signed-off-by: Patrick Daly --- 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 e3e3db917d89..6c39322a9989 100644 --- a/kernel/sched/psi.c +++ b/kernel/sched/psi.c @@ -189,7 +189,7 @@ static void group_init(struct psi_group *group) for_each_possible_cpu(cpu) seqcount_init(&per_cpu_ptr(group->pcpu, cpu)->seq); group->avg_next_update = sched_clock() + psi_period; - INIT_DELAYED_WORK(&group->avgs_work, psi_avgs_work); + INIT_DEFERRABLE_WORK(&group->avgs_work, psi_avgs_work); mutex_init(&group->avgs_lock); /* Init trigger-related members */ atomic_set(&group->poll_scheduled, 0);