Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 43aac893 authored by Juri Lelli's avatar Juri Lelli Committed by Dmitry Shmidt
Browse files

ANDROID: sched/{core,fair}: trigger OPP change request on fork()



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: default avatarJuri Lelli <juri.lelli@arm.com>
Signed-off-by: default avatarSteve Muckle <smuckle@linaro.org>
Signed-off-by: default avatarAndres Oportus <andresoportus@google.com>
parent 4585a266
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2579,7 +2579,7 @@ void wake_up_new_task(struct task_struct *p)
	rq = __task_rq_lock(p, &rf);
	post_init_entity_util_avg(&p->se);

	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);
+4 −7
Original line number Diff line number Diff line
@@ -4529,7 +4529,7 @@ static inline void hrtick_update(struct rq *rq)
#endif

static unsigned long capacity_orig_of(int cpu);
static int cpu_util(int cpu);
static unsigned long cpu_util(int cpu);

static void update_capacity_of(int cpu)
{
@@ -4555,7 +4555,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;

	/*
	 * If in_iowait is set, the code below may not trigger any cpufreq
@@ -4607,12 +4608,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);
+1 −0
Original line number Diff line number Diff line
@@ -1229,6 +1229,7 @@ extern const u32 sched_prio_to_wmult[40];
#else
#define ENQUEUE_MIGRATED	0x00
#endif
#define ENQUEUE_WAKEUP_NEW	0x40

#define RETRY_TASK		((void *)-1UL)