summaryrefslogtreecommitdiff
path: root/kernel/sched/ext.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2025-02-10 10:45:43 -1000
committerTejun Heo <tj@kernel.org>2025-02-10 10:45:43 -1000
commit78e4690de4227393c7cc260739ba94d10ca1df47 (patch)
tree29e37edc8b48600a172912bab345617bf56e425a /kernel/sched/ext.c
parent2e7df12bdde13c0efefc3230dc96b36edfa53ec5 (diff)
parentf3f08c3acfb8860e07a22814a344e83c99ad7398 (diff)
Merge branch 'for-6.14-fixes' into for-6.15
Pull to receive f3f08c3acfb8 ("sched_ext: Fix incorrect assumption about migration disabled tasks in task_can_run_on_remote_rq()") which conflicts with 26176116d931 ("sched_ext: Count SCX_EV_DISPATCH_LOCAL_DSQ_OFFLINE in the right spot") in for-6.15.
Diffstat (limited to 'kernel/sched/ext.c')
-rw-r--r--kernel/sched/ext.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c
index 90a66a2a43d5..98d5f2f68f38 100644
--- a/kernel/sched/ext.c
+++ b/kernel/sched/ext.c
@@ -2447,6 +2447,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
* between scx_bpf_dsq_insert() calls and here. Trigger error iff the
@@ -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);