scx_prio_less() runs from core-sched's pick_next_task() path with rq locked but invokes ops.core_sched_before() with NULL locked_rq, leaving scx_locked_rq_state NULL. If the BPF callback calls a kfunc that re-acquires rq based on scx_locked_rq() - e.g. scx_bpf_cpuperf_set(cpu) - it re-acquires the already-held rq. Pass task_rq(a).
Showing the changes to kernel (1 of 1 file). Show all
Unified · Split
| @@ -3198,7 +3198,7 @@ bool scx_prio_less(const struct task_struct *a, const struct task_struct *b, · 3197 unmodified lines | ||
| 3198 | 3198 | if (sch_a == sch_b && SCX_HAS_OP(sch_a, core_sched_before) && |
| 3199 | 3199 | !scx_bypassing(sch_a, task_cpu(a))) |
| 3200 | 3200 | return SCX_CALL_OP_2TASKS_RET(sch_a, core_sched_before, |
| 3201 | − NULL, | |
| 3201 | + task_rq(a), | |
| 3202 | 3202 | (struct task_struct *)a, |
| 3203 | 3203 | (struct task_struct *)b); |
| 3204 | 3204 | else |