sched/{core,fair}: trigger OPP change request on fork()
authorJuri Lelli <juri.lelli@arm.com>
Fri, 26 Jun 2015 11:14:23 +0000 (12:14 +0100)
committerAmit Pundir <amit.pundir@linaro.org>
Wed, 14 Sep 2016 09:28:22 +0000 (14:58 +0530)
Patch "sched/fair: add triggers for OPP change requests" introduced OPP
change triggers for enqueue_task_fair(), but the trigger was operating only
for wakeups. Fact is that it makes sense to consider wakeup_new also (i.e.,
fork()), as we don't know anything about a newly created task and thus we
most certainly want to jump to max OPP to not harm performance too much.

However, it is not currently possible (or at least it wasn't evident to me
how to do so :/) to tell new wakeups from other (non wakeup) operations.

This patch introduces an additional flag in sched.h that is only set at
fork() time and it is then consumed in enqueue_task_fair() for our purpose.

cc: Ingo Molnar <mingo@redhat.com>
cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Juri Lelli <juri.lelli@arm.com>
Signed-off-by: Steve Muckle <smuckle@linaro.org>
kernel/sched/core.c
kernel/sched/fair.c
kernel/sched/sched.h

index 69a36dd165e291bcbb3ef23f1839a1b657f9e4cf..569a2f0f01e435d40abe56a2d3cfda2791fd0bd7 100644 (file)
@@ -2387,7 +2387,7 @@ void wake_up_new_task(struct task_struct *p)
 #endif
 
        rq = __task_rq_lock(p);
-       activate_task(rq, p, 0);
+       activate_task(rq, p, ENQUEUE_WAKEUP_NEW);
        p->on_rq = TASK_ON_RQ_QUEUED;
        trace_sched_wakeup_new(p);
        check_preempt_curr(rq, p, WF_FORK);
index eba576fe527a93c44139313ed349e0f8ae9a2fe0..4558c6ac2a6616f3a4fccf8a0976fad9ee0c710f 100644 (file)
@@ -4187,7 +4187,8 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
 {
        struct cfs_rq *cfs_rq;
        struct sched_entity *se = &p->se;
-       int task_new = !(flags & ENQUEUE_WAKEUP);
+       int task_new = flags & ENQUEUE_WAKEUP_NEW;
+       int task_wakeup = flags & ENQUEUE_WAKEUP;
 
        for_each_sched_entity(se) {
                if (se->on_rq)
@@ -4231,12 +4232,8 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
                 * because we get here also during load balancing, but
                 * in these cases it seems wise to trigger as single
                 * request after load balancing is done.
-                *
-                * XXX: how about fork()? Do we need a special
-                *      flag/something to tell if we are here after a
-                *      fork() (wakeup_task_new)?
                 */
-               if (!task_new)
+               if (task_new || task_wakeup)
                        update_capacity_of(cpu_of(rq));
        }
        hrtick_update(rq);
index a96fcea5d98b49d5a68efa962a369e15db0713c4..c91e85c90d5d7ff9926751c0ad1129ce86212ff4 100644 (file)
@@ -1181,6 +1181,7 @@ static const u32 prio_to_wmult[40] = {
 #endif
 #define ENQUEUE_REPLENISH      0x08
 #define ENQUEUE_RESTORE        0x10
+#define ENQUEUE_WAKEUP_NEW     0x20
 
 #define DEQUEUE_SLEEP          0x01
 #define DEQUEUE_SAVE           0x02