| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: Quentin Perret <quentin.perret@arm.com> |
| Date: Tue, 30 Jul 2019 13:54:00 +0100 |
| Subject: ANDROID: sched/core: Add a latency-sensitive flag to uclamp |
| |
| Add a 'latency_sensitive' flag to uclamp in order to express the need |
| for some tasks to find a CPU where they can wake-up quickly. This is not |
| expected to be used without cgroup support, so add solely a cgroup |
| interface for it. |
| |
| As this flag represents a boolean attribute and not an amount of |
| resources to be shared, it is not clear what the delegation logic should |
| be. As such, it is kept simple: every new cgroup starts with |
| latency_sensitive set to false, regardless of the parent. |
| |
| In essence, this is similar to SchedTune's prefer-idle flag which was |
| used in android-4.19 and prior. |
| |
| Change-Id: I722d8ecabb428bb7b95a5b54bc70a87f182dde2a |
| Signed-off-by: Quentin Perret <quentin.perret@arm.com> |
| --- |
| kernel/sched/core.c | 33 +++++++++++++++++++++++++++++++++ |
| kernel/sched/sched.h | 2 ++ |
| 2 files changed, 35 insertions(+) |
| |
| diff --git a/kernel/sched/core.c b/kernel/sched/core.c |
| --- a/kernel/sched/core.c |
| +++ b/kernel/sched/core.c |
| @@ -7395,6 +7395,27 @@ static int cpu_uclamp_max_show(struct seq_file *sf, void *v) |
| cpu_uclamp_print(sf, UCLAMP_MAX); |
| return 0; |
| } |
| + |
| +static int cpu_uclamp_ls_write_u64(struct cgroup_subsys_state *css, |
| + struct cftype *cftype, u64 ls) |
| +{ |
| + struct task_group *tg; |
| + |
| + if (ls > 1) |
| + return -EINVAL; |
| + tg = css_tg(css); |
| + tg->latency_sensitive = (unsigned int) ls; |
| + |
| + return 0; |
| +} |
| + |
| +static u64 cpu_uclamp_ls_read_u64(struct cgroup_subsys_state *css, |
| + struct cftype *cft) |
| +{ |
| + struct task_group *tg = css_tg(css); |
| + |
| + return (u64) tg->latency_sensitive; |
| +} |
| #endif /* CONFIG_UCLAMP_TASK_GROUP */ |
| |
| #ifdef CONFIG_FAIR_GROUP_SCHED |
| @@ -7755,6 +7776,12 @@ static struct cftype cpu_legacy_files[] = { |
| .seq_show = cpu_uclamp_max_show, |
| .write = cpu_uclamp_max_write, |
| }, |
| + { |
| + .name = "uclamp.latency_sensitive", |
| + .flags = CFTYPE_NOT_ON_ROOT, |
| + .read_u64 = cpu_uclamp_ls_read_u64, |
| + .write_u64 = cpu_uclamp_ls_write_u64, |
| + }, |
| #endif |
| { } /* Terminate */ |
| }; |
| @@ -7936,6 +7963,12 @@ static struct cftype cpu_files[] = { |
| .seq_show = cpu_uclamp_max_show, |
| .write = cpu_uclamp_max_write, |
| }, |
| + { |
| + .name = "uclamp.latency_sensitive", |
| + .flags = CFTYPE_NOT_ON_ROOT, |
| + .read_u64 = cpu_uclamp_ls_read_u64, |
| + .write_u64 = cpu_uclamp_ls_write_u64, |
| + }, |
| #endif |
| { } /* terminate */ |
| }; |
| diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h |
| --- a/kernel/sched/sched.h |
| +++ b/kernel/sched/sched.h |
| @@ -410,6 +410,8 @@ struct task_group { |
| struct uclamp_se uclamp_req[UCLAMP_CNT]; |
| /* Effective clamp values used for a task group */ |
| struct uclamp_se uclamp[UCLAMP_CNT]; |
| + /* Latency-sensitive flag used for a task group */ |
| + unsigned int latency_sensitive; |
| #endif |
| |
| }; |