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

Commit 2fb7635c authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar
Browse files

sched: sync wakeups vs avg_overlap



While looking at the code I wondered why we always do:

  sync && avg_overlap < migration_cost

Which is a bit odd, since the overlap test was meant to detect sync wakeups
so using it to specialize sync wakeups doesn't make much sense.

Hence change the code to do:

  sync || avg_overlap < migration_cost

Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 990d0f2c
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -1103,6 +1103,11 @@ wake_affine(struct sched_domain *this_sd, struct rq *this_rq,
	if (!(this_sd->flags & SD_WAKE_AFFINE) || !sched_feat(AFFINE_WAKEUPS))
		return 0;

	if (!sync && sched_feat(SYNC_WAKEUPS) &&
	    curr->se.avg_overlap < sysctl_sched_migration_cost &&
	    p->se.avg_overlap < sysctl_sched_migration_cost)
		sync = 1;

	/*
	 * If sync wakeup then subtract the (maximum possible)
	 * effect of the currently running task from the load
@@ -1127,11 +1132,8 @@ wake_affine(struct sched_domain *this_sd, struct rq *this_rq,
	 * a reasonable amount of time then attract this newly
	 * woken task:
	 */
	if (sync && balanced) {
		if (curr->se.avg_overlap < sysctl_sched_migration_cost &&
		    p->se.avg_overlap < sysctl_sched_migration_cost)
	if (sync && balanced)
		return 1;
	}

	schedstat_inc(p, se.nr_wakeups_affine_attempts);
	tl_per_task = cpu_avg_load_per_task(this_cpu);
@@ -1268,9 +1270,9 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int sync)
	if (!sched_feat(WAKEUP_PREEMPT))
		return;

	if (sched_feat(WAKEUP_OVERLAP) && sync &&
			se->avg_overlap < sysctl_sched_migration_cost &&
			pse->avg_overlap < sysctl_sched_migration_cost) {
	if (sched_feat(WAKEUP_OVERLAP) && (sync ||
			(se->avg_overlap < sysctl_sched_migration_cost &&
			 pse->avg_overlap < sysctl_sched_migration_cost))) {
		resched_task(curr);
		return;
	}