[PATCH] sched_ext: Set errno on ENABLING -> ENABLED transition failure
scx_root_enable_workfn() 在 ENABLING→ENABLED cmpxchg 失败时跳转 err_disable,但未设置 ret,导致错误日志输出 failed (0) 无意义。本 patch 在跳转前补设 ret=-EBUSY,与函数顶部其他状态守卫一致。已被 Tejun Heo 合入 sched_ext/for-7.3。
北京时间 2026-06-11 至 2026-09-08
最近同步:2026/09/08 03:19
scx_root_enable_workfn() 在 ENABLING→ENABLED cmpxchg 失败时跳转 err_disable,但未设置 ret,导致错误日志输出 failed (0) 无意义。本 patch 在跳转前补设 ret=-EBUSY,与函数顶部其他状态守卫一致。已被 Tejun Heo 合入 sched_ext/for-7.3。
sched_ext_ops 结构体的成员 cgroup_id 已被重命名为 sub_cgroup_id,但 kernel-doc 注释未同步,导致两处文档警告。本 patch 将 @cgroup_id 更新为 @sub_cgroup_id,已被 Tejun Heo 合入 sched_ext/for-7.3。
本系列为 sched_ext 子调度器中因 CPU 亲和性与 cid 不匹配而搁浅的任务,新增内核侧的带宽受限救援执行机制。调度器在 insert 时标记 SCX_ENQ_RESCUE,内核将任务放入 rescue DSQ 以受限带宽运行,等待过久时升级为不可抢占的 protected execution。当救援队列持续过载时,逐出消耗救援资源最多的子调度器而非归咎于等待者。
sched_ext 内置 idle mask 在 ops.init() 前将所有 online CPU 标记为 idle,但 idle 追踪未启动,导致 busy CPU 被误报为 idle。本系列在调度器启用前开启 idle 追踪并逐 CPU 持 rq lock 刷新状态,同时将 allowed_cpus 自测从竞态的远程 CPU 检查改为稳定的本地不变量验证。v3 将合并静态键并可能扩展不变量检查范围。
sched_ext 的 allowed_cpus 自测在验证远程 CPU 的 idle 状态时存在本质竞态:远程 CPU 可在验证前被 idle re-pick 重新标记为 idle,导致误报。本 patch 将验证改为检查本地 CPU 的 idle 不变量(本地 CPU 不可能在本回调运行期间被 re-pick),并增加引导阶段刷新 idle mask 初始化状态,同时补充了 allowed domain 和 task affinity 的验证。
修复 call_rcu_tasks_generic() 在 IRQ 禁用上下文中与 rq->lock 形成 ABBA 死锁的问题。通过无锁 llist + irq_work 将回调入队延迟到安全上下文执行。RCU maintainer 建议等待上游 call_rcu()/call_srcu() deferral 系列后再提交 v2,并指出 barrier 需排空所有队列及 CPU hotplug 场景需处理。
sched_ext 的 exit 路径在 NMI 上下文中可死锁:scx_claim_exit() 持 scx_sched_lock 遍历子树,bstr kfuncs 持共享 spinlock 格式化消息。本系列将 ->aborting 扫描改为无锁 + 延迟传播、将 bstr exit 改为 claim-first 直接写入 winner 缓冲区,使 scx_bpf_error()/scx_bpf_exit() 可从 NMI 安全调用。同时让 hardlockup handler 直接从 NMI abort(自检测 lockup 可恢复),NMI kick 不再静默丢弃,scx_link_s...
修复 sched_ext 中 reenqueue irq_work 自我重触发导致 stall watchdog 被阻塞的硬锁死问题。将 per-CPU 仅限 local DSQ 的重入队上限泛化为 per-task 计数器,覆盖所有重入队来源,超限时精确弹出所属调度器而非整个层级。v3 增加了 scx_disable_task() 中 reenq_cnt 的清零,防止计数器跨调度器残留。
修复 sched_ext 中 reenqueue 无限循环导致 CPU 锁死的缺陷。旧代码仅对 local DSQ 重入队有 per-cpu 上限,cap rejection 场景无限制,irq_work 自重触发可阻塞 stall watchdog。新方案引入 per-task reenq_cnt,在所有重入队路径的统一漏斗处递增,超限后弹出所属调度器。v2 优化了事件计数时机,v3 将修复 reenq_cnt 在调度类切换时的残留问题并更新文档。
SCX 的 idle tracking 在 WAKE_SYNC 场景下选中 waker CPU 时未将其标为 busy,导致 allowed_cpus selftest 失败。补丁在 scx_select_cpu_dfl() 补上 scx_idle_test_and_clear_cpu(),已被 Tejun Heo 合入 for-7.2-fixes。仍存在极小概率的 pick_task_idle 竞态。