[PATCH] sched_ext: don't rehome a dead task in scx_cgroup_task_migrated

Tao Cui <[email protected]>
Newsgroups dev.linux.lists.sched-ext,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
From: Tao Cui <[email protected]>

A task can exit between cgroup migration commit and the MIGRATED callback:
sched_ext_dead() marks it SCX_TASK_DEAD before cgroup_task_dead() removes it
from the migration list, so scx_cgroup_task_migrated() can pick up a dead
task and call scx_rehome_task(), which re-enables it and leaks the BPF
scheduler's per-task resources. The other scx_rehome_task() callers already
check for this; do the same here.

Fixes: bf9dee58ab56 ("sched_ext: Re-home tasks on cgroup migration")
Signed-off-by: Tao Cui <[email protected]>
---
 kernel/sched/ext/sub.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/kernel/sched/ext/sub.c b/kernel/sched/ext/sub.c
index b81254be1b04..8f8d21b85abe 100644
--- a/kernel/sched/ext/sub.c
+++ b/kernel/sched/ext/sub.c
@@ -2083,6 +2083,13 @@ static void scx_cgroup_task_migrated(struct cgroup_task_migrate_ctx *ctx)
 		return;
 
 	rq = task_rq_lock(p, &rf);
+
+	if (scx_get_task_state(p) == SCX_TASK_DEAD) {
+		/* sched_ext_dead() raced us */
+		task_rq_unlock(rq, p, &rf);
+		return;
+	}
+
 	scx_rehome_task(to, p);
 	task_rq_unlock(rq, p, &rf);
 }
-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.