mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
sched_ext: Skip tasks with stale task_rq in bypass_lb_cpu()
bypass_lb_cpu() transfers tasks between per-CPU bypass DSQs without
migrating them - task_cpu() only updates when the donee later consumes the
task via move_remote_task_to_local_dsq(). If the LB timer fires again before
consumption and the new DSQ becomes a donor, @p is still on the previous CPU
and task_rq(@p) != donor_rq. @p can't be moved without its own rq locked.
Skip such tasks.
Fixes: 95d1df610c ("sched_ext: Implement load balancer for bypass mode")
Cc: stable@vger.kernel.org # v6.19+
Reported-by: Chris Mason <clm@meta.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Andrea Righi <arighi@nvidia.com>
This commit is contained in:
parent
4fda9f0e7c
commit
da2d81b411
|
|
@ -5023,6 +5023,15 @@ static u32 bypass_lb_cpu(struct scx_sched *sch, s32 donor,
|
|||
if (cpumask_empty(donee_mask))
|
||||
break;
|
||||
|
||||
/*
|
||||
* If an earlier pass placed @p on @donor_dsq from a different
|
||||
* CPU and the donee hasn't consumed it yet, @p is still on the
|
||||
* previous CPU and task_rq(@p) != @donor_rq. @p can't be moved
|
||||
* without its rq locked. Skip.
|
||||
*/
|
||||
if (task_rq(p) != donor_rq)
|
||||
continue;
|
||||
|
||||
donee = cpumask_any_and_distribute(donee_mask, p->cpus_ptr);
|
||||
if (donee >= nr_cpu_ids)
|
||||
continue;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user