Messages in this thread Patch in this message | | | From | Parth Shah <> | Subject | [RFC 3/3] Allow sched_{get,set}attr to change latency_tolerance of the task | Date | Mon, 25 Nov 2019 15:16:18 +0530 |
| |
Introduce the latency_tolerance attribute to sched_attr and provide a mechanism to change the value with the use of sched_setattr/sched_getattr syscall.
Also add new flag "SCHED_FLAG_LATENCY_TOLERANCE" to hint the change in latency_tolerance of the task on every sched_setattr syscall.
Signed-off-by: Parth Shah <parth@linux.ibm.com> --- include/uapi/linux/sched.h | 4 +++- include/uapi/linux/sched/types.h | 2 ++ kernel/sched/core.c | 15 +++++++++++++++ kernel/sched/sched.h | 1 + 4 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/include/uapi/linux/sched.h b/include/uapi/linux/sched.h index b3105ac1381a..73db430d11b6 100644 --- a/include/uapi/linux/sched.h +++ b/include/uapi/linux/sched.h @@ -71,6 +71,7 @@ struct clone_args { #define SCHED_FLAG_KEEP_PARAMS 0x10 #define SCHED_FLAG_UTIL_CLAMP_MIN 0x20 #define SCHED_FLAG_UTIL_CLAMP_MAX 0x40 +#define SCHED_FLAG_LATENCY_TOLERANCE 0x80 #define SCHED_FLAG_KEEP_ALL (SCHED_FLAG_KEEP_POLICY | \ SCHED_FLAG_KEEP_PARAMS) @@ -82,6 +83,7 @@ struct clone_args { SCHED_FLAG_RECLAIM | \ SCHED_FLAG_DL_OVERRUN | \ SCHED_FLAG_KEEP_ALL | \ - SCHED_FLAG_UTIL_CLAMP) + SCHED_FLAG_UTIL_CLAMP | \ + SCHED_FLAG_LATENCY_TOLERANCE) #endif /* _UAPI_LINUX_SCHED_H */ diff --git a/include/uapi/linux/sched/types.h b/include/uapi/linux/sched/types.h index c852153ddb0d..960774ac0c70 100644 --- a/include/uapi/linux/sched/types.h +++ b/include/uapi/linux/sched/types.h @@ -118,6 +118,8 @@ struct sched_attr { __u32 sched_util_min; __u32 sched_util_max; + /* latency requirement hints */ + __s32 sched_latency_tolerance; }; #endif /* _UAPI_LINUX_SCHED_TYPES_H */ diff --git a/kernel/sched/core.c b/kernel/sched/core.c index ea7abbf5c1bb..dfd36ec14404 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -4695,6 +4695,9 @@ static void __setscheduler_params(struct task_struct *p, p->rt_priority = attr->sched_priority; p->normal_prio = normal_prio(p); set_load_weight(p, true); + + /* Change latency tolerance of the task if !SCHED_FLAG_KEEP_PARAMS */ + p->latency_tolerance = attr->sched_latency_tolerance; } /* Actually do priority change: must hold pi & rq lock. */ @@ -4852,6 +4855,13 @@ static int __sched_setscheduler(struct task_struct *p, return retval; } + if (attr->sched_flags & SCHED_FLAG_LATENCY_TOLERANCE) { + if (attr->sched_latency_tolerance > MAX_LATENCY_TOLERANCE) + return -EINVAL; + if (attr->sched_latency_tolerance < MIN_LATENCY_TOLERANCE) + return -EINVAL; + } + if (pi) cpuset_read_lock(); @@ -4886,6 +4896,9 @@ static int __sched_setscheduler(struct task_struct *p, goto change; if (attr->sched_flags & SCHED_FLAG_UTIL_CLAMP) goto change; + if (attr->sched_flags & SCHED_FLAG_LATENCY_TOLERANCE && + attr->sched_latency_tolerance != p->latency_tolerance) + goto change; p->sched_reset_on_fork = reset_on_fork; retval = 0; @@ -5392,6 +5405,8 @@ SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr, else kattr.sched_nice = task_nice(p); + kattr.sched_latency_tolerance = p->latency_tolerance; + #ifdef CONFIG_UCLAMP_TASK kattr.sched_util_min = p->uclamp_req[UCLAMP_MIN].value; kattr.sched_util_max = p->uclamp_req[UCLAMP_MAX].value; diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 0db2c1b3361e..bb181175954b 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -21,6 +21,7 @@ #include <linux/sched/nohz.h> #include <linux/sched/numa_balancing.h> #include <linux/sched/prio.h> +#include <linux/sched/latency_tolerance.h> #include <linux/sched/rt.h> #include <linux/sched/signal.h> #include <linux/sched/smt.h> -- 2.17.2
| |