Jitter tasks are short/bursty tasks,typically performing some housekeeping and are less important in the overall scheme of things. In this patch we provide a mechanism based on Patrick Bellasi's UCLAMP framework to classify jitter tasks"
We define jitter tasks as those whose util.max in the UCLAMP framework is the least (=0). This also provides benefit of giving the least frequency to those jitter tasks, which is useful if all jitters are packed onto a separate core." UCLAMP already provides a way to set util.max for a task by using a syscall interface. This patch uses the `sched_setattr` syscall to set sched_util_max attribute of the task which is used to classify the task as jitter. Use Case with turbo_bench.c =================== ``` i=8; ./turbo_bench -t 30 -h $i -n $((2*i)) -j ``` This spawns 2*i total threads: of which i-CPU bound and i-jitter threads. Signed-off-by: Parth Shah <pa...@linux.ibm.com> --- include/linux/sched.h | 6 ++++++ kernel/sched/core.c | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/include/linux/sched.h b/include/linux/sched.h index e2d80e6a187d..2bd9f75a3abb 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -696,6 +696,12 @@ struct task_struct { struct uclamp_se uclamp_req[UCLAMP_CNT]; /* Effective clamp values used for a scheduling entity */ struct uclamp_se uclamp[UCLAMP_CNT]; + /* + * Tag the task as jitter. + * 0 = regular. Follows regular CFS policy for task placement. + * 1 = Jitter tasks. Should be packed to reduce active core count. + */ + unsigned int is_jitter; #endif #ifdef CONFIG_PREEMPT_NOTIFIERS diff --git a/kernel/sched/core.c b/kernel/sched/core.c index ab0aa319fe60..19c7204d6351 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1189,6 +1189,15 @@ static void __setscheduler_uclamp(struct task_struct *p, if (attr->sched_flags & SCHED_FLAG_UTIL_CLAMP_MAX) { uclamp_se_set(&p->uclamp_req[UCLAMP_MAX], attr->sched_util_max, true); + + /* + * Set task to jitter class if Max util is clamped to the least + * possible value + */ + if (p->uclamp_req[UCLAMP_MAX].bucket_id == 0 && !p->is_jitter) + p->is_jitter = 1; + else if (p->is_jitter) + p->is_jitter = 0; } } -- 2.17.1