Thread (50 messages) 50 messages, 3 authors, 2019-05-09

Re: [PATCH v8 06/16] sched/core: uclamp: Extend sched_setattr() to support utilization clamping

From: Patrick Bellasi <hidden>
Date: 2019-05-07 11:13:55
Also in: linux-pm, lkml

On 17-Apr 15:26, Suren Baghdasaryan wrote:
On Tue, Apr 2, 2019 at 3:42 AM Patrick Bellasi [off-list ref] wrote:
[...]
quoted
Do not allow to change sched class specific params and non class
specific params (i.e. clamp values) at the same time.  This keeps things
simple and still works for the most common cases since we are usually
interested in just one of the two actions.
Sorry, I can't find where you are checking to eliminate the
possibility of simultaneous changes to both sched class specific
params and non class specific params... Am I too tired or they are
indeed missing?
No, you right... that limitation has been removed in v8 :)

I'll remove the above paragraph in v9, thanks for spotting it.

[...]
quoted
+static int uclamp_validate(struct task_struct *p,
+                          const struct sched_attr *attr)
+{
+       unsigned int lower_bound = p->uclamp_req[UCLAMP_MIN].value;
+       unsigned int upper_bound = p->uclamp_req[UCLAMP_MAX].value;
+
+       if (attr->sched_flags & SCHED_FLAG_UTIL_CLAMP_MIN)
+               lower_bound = attr->sched_util_min;
+       if (attr->sched_flags & SCHED_FLAG_UTIL_CLAMP_MAX)
+               upper_bound = attr->sched_util_max;
+
+       if (lower_bound > upper_bound)
+               return -EINVAL;
+       if (upper_bound > SCHED_CAPACITY_SCALE)
+               return -EINVAL;
+
+       return 0;
+}
[...]
quoted
 static void uclamp_fork(struct task_struct *p)
 {
        unsigned int clamp_id;
@@ -1056,6 +1100,13 @@ static void __init init_uclamp(void)
 #else /* CONFIG_UCLAMP_TASK */
 static inline void uclamp_rq_inc(struct rq *rq, struct task_struct *p) { }
 static inline void uclamp_rq_dec(struct rq *rq, struct task_struct *p) { }
+static inline int uclamp_validate(struct task_struct *p,
+                                 const struct sched_attr *attr)
+{
+       return -ENODEV;
ENOSYS might be more appropriate?
Yep, agree, thanks!
quoted
+}
+static void __setscheduler_uclamp(struct task_struct *p,
+                                 const struct sched_attr *attr) { }
 static inline void uclamp_fork(struct task_struct *p) { }
 static inline void init_uclamp(void) { }
 #endif /* CONFIG_UCLAMP_TASK */
@@ -4424,6 +4475,13 @@ static void __setscheduler_params(struct task_struct *p,
 static void __setscheduler(struct rq *rq, struct task_struct *p,
                           const struct sched_attr *attr, bool keep_boost)
 {
+       /*
+        * If params can't change scheduling class changes aren't allowed
+        * either.
+        */
+       if (attr->sched_flags & SCHED_FLAG_KEEP_PARAMS)
+               return;
+
        __setscheduler_params(p, attr);

        /*
@@ -4561,6 +4619,13 @@ static int __sched_setscheduler(struct task_struct *p,
                        return retval;
        }

+       /* Update task specific "requested" clamps */
+       if (attr->sched_flags & SCHED_FLAG_UTIL_CLAMP) {
+               retval = uclamp_validate(p, attr);
+               if (retval)
+                       return retval;
+       }
+
        /*
         * Make sure no PI-waiters arrive (or leave) while we are
         * changing the priority of the task:
[...]

-- 
#include <best/regards.h>

Patrick Bellasi
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help