From: Peter Zijlstra Date: Tue, 28 Oct 2025 14:04:17 +0000 (+0100) Subject: Merge branch 'linus/master' into sched/core, to resolve conflict X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=977b9a00541929973fddfbc2f5e932469f7cdc81;p=thirdparty%2Flinux.git Merge branch 'linus/master' into sched/core, to resolve conflict Conflicts: kernel/sched/ext.c Signed-off-by: Peter Zijlstra (Intel) Signed-off-by: Ingo Molnar --- 977b9a00541929973fddfbc2f5e932469f7cdc81 diff --cc kernel/sched/ext.c index 49f4a9e763486,ecb251e883eab..b063444dc003f --- a/kernel/sched/ext.c +++ b/kernel/sched/ext.c @@@ -2298,22 -2368,41 +2332,23 @@@ static struct task_struct *first_local_ struct task_struct, scx.dsq_list.node); } -static struct task_struct *pick_task_scx(struct rq *rq) +static struct task_struct *pick_task_scx(struct rq *rq, struct rq_flags *rf) { struct task_struct *prev = rq->curr; + bool keep_prev, kick_idle = false; struct task_struct *p; - bool keep_prev = rq->scx.flags & SCX_RQ_BAL_KEEP; - bool kick_idle = false; - /* - * WORKAROUND: - * - * %SCX_RQ_BAL_KEEP should be set iff $prev is on SCX as it must just - * have gone through balance_scx(). Unfortunately, there currently is a - * bug where fair could say yes on balance() but no on pick_task(), - * which then ends up calling pick_task_scx() without preceding - * balance_scx(). - * - * Keep running @prev if possible and avoid stalling from entering idle - * without balancing. - * - * Once fair is fixed, remove the workaround and trigger WARN_ON_ONCE() - * if pick_task_scx() is called without preceding balance_scx(). - */ - if (unlikely(rq->scx.flags & SCX_RQ_BAL_PENDING)) { - if (prev->scx.flags & SCX_TASK_QUEUED) { - keep_prev = true; - } else { - keep_prev = false; - kick_idle = true; - } - } else if (unlikely(keep_prev && - prev->sched_class != &ext_sched_class)) { - /* - * Can happen while enabling as SCX_RQ_BAL_PENDING assertion is - * conditional on scx_enabled() and may have been skipped. - */ + rq_modified_clear(rq); + rq_unpin_lock(rq, rf); + balance_one(rq, prev); + rq_repin_lock(rq, rf); ++ maybe_queue_balance_callback(rq); + if (rq_modified_above(rq, &ext_sched_class)) + return RETRY_TASK; + + keep_prev = rq->scx.flags & SCX_RQ_BAL_KEEP; + if (unlikely(keep_prev && + prev->sched_class != &ext_sched_class)) { WARN_ON_ONCE(scx_enable_state() == SCX_ENABLED); keep_prev = false; }