Messages in this thread | | | Date | Sat, 4 Dec 2021 10:43:49 +0100 | From | Peter Zijlstra <> | Subject | Re: [PATCH v2] sched/uclamp: Fix rq->uclamp_max not set on first enqueue |
| |
On Thu, Dec 02, 2021 at 11:20:33AM +0000, Qais Yousef wrote: > Commit d81ae8aac85c ("sched/uclamp: Fix initialization of struct > uclamp_rq") introduced a bug where uclamp_max of the rq is not reset to > match the woken up task's uclamp_max when the rq is idle. > > The code was relying on rq->uclamp_max initialized to zero, so on first > enqueue > > static inline void uclamp_rq_inc_id(struct rq *rq, struct task_struct *p, > enum uclamp_id clamp_id) > { > ... > > if (uc_se->value > READ_ONCE(uc_rq->value)) > WRITE_ONCE(uc_rq->value, uc_se->value); > } > > was actually resetting it. But since commit d81ae8aac85c changed the > default to 1024, this no longer works. And since rq->uclamp_flags is > also initialized to 0, neither above code path nor uclamp_idle_reset() > update the rq->uclamp_max on first wake up from idle. > > This is only visible from first wake up(s) until the first dequeue to > idle after enabling the static key. And it only matters if the > uclamp_max of this task is < 1024 since only then its uclamp_max will be > effectively ignored. > > Fix it by properly initializing rq->uclamp_flags = UCLAMP_FLAG_IDLE to > ensure uclamp_idle_reset() is called which then will update the rq > uclamp_max value as expected. > > Fixes: d81ae8aac85c ("sched/uclamp: Fix initialization of struct uclamp_rq") > Signed-off-by: Qais Yousef <qais.yousef@arm.com> > Reviewed-by: Valentin Schneider <Valentin.Schneider@arm.com> > Tested-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Thanks!
| |