Commit 9f593d4a authored by Steve Sistare's avatar Steve Sistare Committed by Cheng Jian
Browse files

sched/fair: Provide can_migrate_task_llc

hulk inclusion
category: feature
bugzilla: 38261, https://bugzilla.openeuler.org/show_bug.cgi?id=23


CVE: NA

---------------------------

Define a simpler version of can_migrate_task called can_migrate_task_llc
which does not require a struct lb_env argument, and judges whether a
migration from one CPU to another within the same LLC should be allowed.

Signed-off-by: default avatarSteve Sistare <steven.sistare@oracle.com>
Signed-off-by: default avatarCheng Jian <cj.chengjian@huawei.com>
Reviewed-by: default avatarHanjun Guo <guohanjun@huawei.com>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
Reviewed-by: default avatarXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
parent dcd028f8
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -7341,6 +7341,34 @@ int can_migrate_task(struct task_struct *p, struct lb_env *env)
	return 0;
}

/*
 * Return true if task @p can migrate from @rq to @dst_rq in the same LLC.
 * No need to test for co-locality, and no need to test task_hot(), as sharing
 * LLC provides cache warmth at that level.
 */
static bool
can_migrate_task_llc(struct task_struct *p, struct rq *rq, struct rq *dst_rq)
{
	int dst_cpu = dst_rq->cpu;

	lockdep_assert_held(&rq->lock);

	if (throttled_lb_pair(task_group(p), cpu_of(rq), dst_cpu))
		return false;

	if (!cpumask_test_cpu(dst_cpu, &p->cpus_allowed)) {
		schedstat_inc(p->se.statistics.nr_failed_migrations_affine);
		return false;
	}

	if (task_running(rq, p)) {
		schedstat_inc(p->se.statistics.nr_failed_migrations_running);
		return false;
	}

	return true;
}

/*
 * detach_task() -- detach the task for the migration from @src_rq to @dst_cpu.
 */