Commit 78e4690d authored by Tejun Heo's avatar Tejun Heo
Browse files

Merge branch 'for-6.14-fixes' into for-6.15

Pull to receive f3f08c3a ("sched_ext: Fix incorrect assumption about
migration disabled tasks in task_can_run_on_remote_rq()") which conflicts
with 26176116 ("sched_ext: Count SCX_EV_DISPATCH_LOCAL_DSQ_OFFLINE in
the right spot") in for-6.15.
parents 2e7df12b f3f08c3a
Loading
Loading
Loading
Loading
+21 −8
Original line number Diff line number Diff line
@@ -2446,6 +2446,25 @@ static bool task_can_run_on_remote_rq(struct task_struct *p, struct rq *rq,

	SCHED_WARN_ON(task_cpu(p) == cpu);

	/*
	 * If @p has migration disabled, @p->cpus_ptr is updated to contain only
	 * the pinned CPU in migrate_disable_switch() while @p is being switched
	 * out. However, put_prev_task_scx() is called before @p->cpus_ptr is
	 * updated and thus another CPU may see @p on a DSQ inbetween leading to
	 * @p passing the below task_allowed_on_cpu() check while migration is
	 * disabled.
	 *
	 * Test the migration disabled state first as the race window is narrow
	 * and the BPF scheduler failing to check migration disabled state can
	 * easily be masked if task_allowed_on_cpu() is done first.
	 */
	if (unlikely(is_migration_disabled(p))) {
		if (enforce)
			scx_ops_error("SCX_DSQ_LOCAL[_ON] cannot move migration disabled %s[%d] from CPU %d to %d",
				      p->comm, p->pid, task_cpu(p), cpu);
		return false;
	}

	/*
	 * We don't require the BPF scheduler to avoid dispatching to offline
	 * CPUs mostly for convenience but also because CPUs can go offline
@@ -2454,17 +2473,11 @@ static bool task_can_run_on_remote_rq(struct task_struct *p, struct rq *rq,
	 */
	if (!task_allowed_on_cpu(p, cpu)) {
		if (enforce)
			scx_ops_error("SCX_DSQ_LOCAL[_ON] verdict target cpu %d not allowed for %s[%d]",
				      cpu_of(rq), p->comm, p->pid);
			scx_ops_error("SCX_DSQ_LOCAL[_ON] target CPU %d not allowed for %s[%d]",
				      cpu, p->comm, p->pid);
		return false;
	}

	/*
	 * If @p has migration disabled, @p->cpus_ptr only contains its current
	 * CPU and the above task_allowed_on_cpu() test should have failed.
	 */
	SCHED_WARN_ON(is_migration_disabled(p));

	if (!scx_rq_online(rq)) {
		if (enforce)
			__scx_add_event(SCX_EV_DISPATCH_LOCAL_DSQ_OFFLINE, 1);