diff options
| author | Tejun Heo <tj@kernel.org> | 2026-03-06 07:58:03 -1000 |
|---|---|---|
| committer | Tejun Heo <tj@kernel.org> | 2026-03-06 07:58:03 -1000 |
| commit | bb4d9fd551588165dc918aa2f2108b939e3367db (patch) | |
| tree | 79e53560caf9ba43a0191d8439ad6acb484825fa /kernel | |
| parent | 245d09c594ea40dbd4b8f989f2422dbc8e65a61c (diff) | |
sched_ext: scx_dsq_move() should validate the task belongs to the right scheduler
scx_bpf_dsq_move[_vtime]() calls scx_dsq_move() to move task from a DSQ to
another. However, @p doesn't necessarily have to come form the containing
iteration and can thus be a task which belongs to another scx_sched. Verify
that @p is on the same scx_sched as the DSQ being iterated.
Signed-off-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Andrea Righi <arighi@nvidia.com>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched/ext.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c index beb0e3443209..7d74f7b119ca 100644 --- a/kernel/sched/ext.c +++ b/kernel/sched/ext.c @@ -6718,8 +6718,8 @@ static const struct btf_kfunc_id_set scx_kfunc_set_enqueue_dispatch = { static bool scx_dsq_move(struct bpf_iter_scx_dsq_kern *kit, struct task_struct *p, u64 dsq_id, u64 enq_flags) { - struct scx_sched *sch = scx_root; struct scx_dispatch_q *src_dsq = kit->dsq, *dst_dsq; + struct scx_sched *sch = src_dsq->sched; struct rq *this_rq, *src_rq, *locked_rq; bool dispatched = false; bool in_balance; @@ -6736,6 +6736,11 @@ static bool scx_dsq_move(struct bpf_iter_scx_dsq_kern *kit, if (unlikely(READ_ONCE(scx_aborting))) return false; + if (unlikely(!scx_task_on_sched(sch, p))) { + scx_error(sch, "scx_bpf_dsq_move[_vtime]() on %s[%d] but the task belongs to a different scheduler", + p->comm, p->pid); + } + /* * Can be called from either ops.dispatch() locking this_rq() or any * context where no rq lock is held. If latter, lock @p's task_rq which |
