| From 7226017ad37a888915628e59a84a2d1e57b40707 Mon Sep 17 00:00:00 2001 |
| From: Qais Yousef <qais.yousef@arm.com> |
| Date: Tue, 24 Dec 2019 11:54:04 +0000 |
| Subject: sched/uclamp: Fix a bug in propagating uclamp value in new cgroups |
| |
| From: Qais Yousef <qais.yousef@arm.com> |
| |
| commit 7226017ad37a888915628e59a84a2d1e57b40707 upstream. |
| |
| When a new cgroup is created, the effective uclamp value wasn't updated |
| with a call to cpu_util_update_eff() that looks at the hierarchy and |
| update to the most restrictive values. |
| |
| Fix it by ensuring to call cpu_util_update_eff() when a new cgroup |
| becomes online. |
| |
| Without this change, the newly created cgroup uses the default |
| root_task_group uclamp values, which is 1024 for both uclamp_{min, max}, |
| which will cause the rq to to be clamped to max, hence cause the |
| system to run at max frequency. |
| |
| The problem was observed on Ubuntu server and was reproduced on Debian |
| and Buildroot rootfs. |
| |
| By default, Ubuntu and Debian create a cpu controller cgroup hierarchy |
| and add all tasks to it - which creates enough noise to keep the rq |
| uclamp value at max most of the time. Imitating this behavior makes the |
| problem visible in Buildroot too which otherwise looks fine since it's a |
| minimal userspace. |
| |
| Fixes: 0b60ba2dd342 ("sched/uclamp: Propagate parent clamps") |
| Reported-by: Doug Smythies <dsmythies@telus.net> |
| Signed-off-by: Qais Yousef <qais.yousef@arm.com> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Tested-by: Doug Smythies <dsmythies@telus.net> |
| Link: https://lore.kernel.org/lkml/000701d5b965$361b6c60$a2524520$@net/ |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/sched/core.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| --- a/kernel/sched/core.c |
| +++ b/kernel/sched/core.c |
| @@ -7090,6 +7090,12 @@ static int cpu_cgroup_css_online(struct |
| |
| if (parent) |
| sched_online_group(tg, parent); |
| + |
| +#ifdef CONFIG_UCLAMP_TASK_GROUP |
| + /* Propagate the effective uclamp value for the new group */ |
| + cpu_util_update_eff(css); |
| +#endif |
| + |
| return 0; |
| } |
| |