Commit 8fef0a3
committed
sched_ext: Fix pick_task_scx() picking non-queued tasks when it's called without balance()
a6250aa ("sched_ext: Handle cases where pick_task_scx() is called
without preceding balance_scx()") added a workaround to handle the cases
where pick_task_scx() is called without prececing balance_scx() which is due
to a fair class bug where pick_taks_fair() may return NULL after a true
return from balance_fair().
The workaround detects when pick_task_scx() is called without preceding
balance_scx() and emulates SCX_RQ_BAL_KEEP and triggers kicking to avoid
stalling. Unfortunately, the workaround code was testing whether @Prev was
on SCX to decide whether to keep the task running. This is incorrect as the
task may be on SCX but no longer runnable.
This could lead to a non-runnable task to be returned from pick_task_scx()
which cause interesting confusions and failures. e.g. A common failure mode
is the task ending up with (!on_rq && on_cpu) state which can cause
potential wakers to busy loop, which can easily lead to deadlocks.
Fix it by testing whether @Prev has SCX_TASK_QUEUED set. This makes
@prev_on_scx only used in one place. Open code the usage and improve the
comment while at it.
Signed-off-by: Tejun Heo <[email protected]>
Reported-by: Pat Cody <[email protected]>
Fixes: a6250aa ("sched_ext: Handle cases where pick_task_scx() is called without preceding balance_scx()")
Cc: [email protected] # v6.12+
Acked-by: Andrea Righi <[email protected]>1 parent f5717c9 commit 8fef0a3
1 file changed
+7
-4
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3117 | 3117 | | |
3118 | 3118 | | |
3119 | 3119 | | |
3120 | | - | |
3121 | 3120 | | |
3122 | 3121 | | |
3123 | 3122 | | |
| |||
3137 | 3136 | | |
3138 | 3137 | | |
3139 | 3138 | | |
3140 | | - | |
| 3139 | + | |
3141 | 3140 | | |
3142 | 3141 | | |
3143 | 3142 | | |
3144 | 3143 | | |
3145 | 3144 | | |
3146 | | - | |
3147 | | - | |
| 3145 | + | |
| 3146 | + | |
| 3147 | + | |
| 3148 | + | |
| 3149 | + | |
| 3150 | + | |
3148 | 3151 | | |
3149 | 3152 | | |
3150 | 3153 | | |
| |||
0 commit comments