]> git.baikalelectronics.ru Git - kernel.git/commit
sched/uclamp: Fix rq->uclamp_max not set on first enqueue
authorQais Yousef <qais.yousef@arm.com>
Thu, 2 Dec 2021 11:20:33 +0000 (11:20 +0000)
committerPeter Zijlstra <peterz@infradead.org>
Sat, 4 Dec 2021 09:56:18 +0000 (10:56 +0100)
commite57fe1b8e4d600126a56885f5849e9a55c32c9fe
tree87910ef6cb369885b6d0f193729a44e06f7e0a4b
parentc5a57dca5b8d83de71723d021d5a1871634c2633
sched/uclamp: Fix rq->uclamp_max not set on first enqueue

Commit f555fba8c72e ("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 f555fba8c72e 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: f555fba8c72e ("sched/uclamp: Fix initialization of struct uclamp_rq")
Signed-off-by: Qais Yousef <qais.yousef@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Valentin Schneider <Valentin.Schneider@arm.com>
Tested-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Link: https://lkml.kernel.org/r/20211202112033.1705279-1-qais.yousef@arm.com
kernel/sched/core.c