sched/uclamp: Fix fits_capacity() check in feec()
authorQais Yousef <qais.yousef@arm.com>
Thu, 4 Aug 2022 14:36:03 +0000 (15:36 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Thu, 27 Oct 2022 09:01:18 +0000 (11:01 +0200)
commit244226035a1f9b2b6c326e55ae5188fab4f428cb
tree54019e47494836ed44cee16a4b8bd86dc41a6379
parentb48e16a69792b5dc4a09d6807369d11b2970cc36
sched/uclamp: Fix fits_capacity() check in feec()

As reported by Yun Hsiang [1], if a task has its uclamp_min >= 0.8 * 1024,
it'll always pick the previous CPU because fits_capacity() will always
return false in this case.

The new util_fits_cpu() logic should handle this correctly for us beside
more corner cases where similar failures could occur, like when using
UCLAMP_MAX.

We open code uclamp_rq_util_with() except for the clamp() part,
util_fits_cpu() needs the 'raw' values to be passed to it.

Also introduce uclamp_rq_{set, get}() shorthand accessors to get uclamp
value for the rq. Makes the code more readable and ensures the right
rules (use READ_ONCE/WRITE_ONCE) are respected transparently.

[1] https://lists.linaro.org/pipermail/eas-dev/2020-July/001488.html

Fixes: 1d42509e475c ("sched/fair: Make EAS wakeup placement consider uclamp restrictions")
Reported-by: Yun Hsiang <hsiang023167@gmail.com>
Signed-off-by: Qais Yousef <qais.yousef@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220804143609.515789-4-qais.yousef@arm.com
kernel/sched/core.c
kernel/sched/fair.c
kernel/sched/sched.h