[PATCH] sched_ext: Fix stale @cgroup_id in sched_ext_ops kernel-doc
sched_ext_ops 结构体的成员 cgroup_id 已被重命名为 sub_cgroup_id,但 kernel-doc 注释未同步,导致两处文档警告。本 patch 将 @cgroup_id 更新为 @sub_cgroup_id,已被 Tejun Heo 合入 sched_ext/for-7.3。
北京时间全部历史数据
最近同步:2026/08/28 15:52
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 竞态。
修正 idle.c 中三处 kernel-doc 注释将 %SCX_PICK_IDLE_CPU_* 错写为不存在的枚举前缀,改为与 scx_pick_idle_cpu_flags 成员一致的 %SCX_PICK_IDLE_*。已由 Tejun Heo 合入 sched_ext/for-7.3。
为 sched_ext 中三类 __rcu 指针的裸读取添加合规标注:cgrp->scx_sched 通过 scx_cgroup_sched() 声明三锁保护,scx_root 通过 scx_root_protected_live/protected() 声明 live 不变式或锁排他,dsq->first_task 用 rcu_access_pointer() 做身份比较。全部无功能变更,已合入 for-7.3。
Andrea Righi 发布 PATCHSET v9,共 14 个补丁,移除 SCHED_PROXY_EXEC 与 SCHED_CLASS_EXT 的构建期互斥。在核心调度器侧把 rq->donor 与 rq->curr 拆开,新增 SCX_OPS_ENQ_BLOCKED 能力位让 BPF scheduler 显式选择是否接管 blocked donor,并同步修复 NOHZ 带宽检查、远端 DSQ 迁移竞态、ops.running/stopping 配对等问题。配套提供 enq_blocked selftest 和 scx_qmap -B 演示选项。
本系列修复两个问题:用户态工具在 exit_req 与 RESTART 同时存在时陷入无限重启循环;sub-scheduler 的 cid-addressed reenq、kick 和 cpuperf 操作缺少权限检查,无 cap 的 sub-sched 可触发他人 CPU 的 IPI 和频率调整。Patch 1 修复 restart 逻辑,Patch 2-3 给 reenq/kick 加 SCX_CAP_BASE 门控并计数拒绝,Patch 4 重构 cpuperf setter,Patch 5 新增 SCX_CAP_PERF 门控 cpuperf 并同步返回结果。
本系列修复 sched_ext 工具在重启等待期忽略 exit_req 导致无限循环的 bug,并堵住子调度器三个权限漏洞:reenq IPI、kick 拒绝和 cidperf cpufreq 操控无 cap 检查。新增 SCX_CAP_PERF 作为独立 cpufreq 权限轴,cidperf_set 通过版本化 v2 kfunc 同步返回拒绝结果。所有拒绝操作均有事件计数器可观测。
补丁修复 kernel/sched/ext/ext.c 中 6 处 kernel-doc 注释缺陷:为 finish_dispatch、scx_rcu_cpu_stall、scx_hardlockup 补齐缺失参数描述,并将 3 个版本化 BPF kfunc 的注释函数名从公开别名改为带 ___v2 后缀的 C 定义名,消除构建警告。Tejun Heo 已合入 sched_ext/for-7.3。
当睡眠任务的 CPU affinity 在睡眠期间被修改后,task_cpu(p) 可能指向已不在 cpus_ptr 中的 CPU,导致 NUMA node 选定后找不到合法 CPU,sched_ext 框架报 "invalid CPU -16" 并使调度器异常退出。补丁在 numa_select_cpu() 中检测 cpumask 不一致时回退 prev_cpu 兜底,Tejun Heo 已 apply 到 for-7.2-fixes。
PATCHSET v8 用 12 个补丁让 CONFIG_SCHED_PROXY_EXEC 与 CONFIG_SCHED_CLASS_EXT 不再互斥,方法是把 rq->donor 与 rq->curr 拆分、由 BPF 通过 SCX_OPS_ENQ_BLOCKED 显式接收 blocked donor,并修复了 set_task_cpu 假告警、consume_remote_task 迁移竞态、NOHZ 带宽核算错、running/stopping 不配对等副作用。John Stultz 已 ack 多处,Tejun Heo 提出用 class callback 替换直接调用、把 GDSQ_...
scx_sub_enable_workfn() 中嵌套深度检查和 cgroup online 检查两条错误路径跳到 err_disable 时未设置 ret,导致 fallback 日志打印 errno=0。补丁分别设置 -EINVAL 和 -ENODEV 使 fallback 报告真实错误码。当前因 scx_error 的 first-error-wins 机制而无害,但 fallback 机制本身是坏的,需要修复。
将 scx_pair 的 ops.cpu_acquire/release() 废弃回调替换为 tp_btf/sched_switch tracepoint 边沿检测,用 p->prio 判断高优先级抢占,消除加载时的废弃警告。idle→高优先级直跳不算 release,sched_setscheduler() 的盲区与旧回调一致。已由 Tejun Heo 合入 sched_ext/for-7.3。
本系列修复 sched_ext 子调度器层级下 runnable stall 归咎错误和 bypass 期间无效 CPU 选择,并将 cid 映射表从原地填充改为私有构建+RCU 发布,消除 BPF kfunc 竞态读取未初始化或撕裂数据的风险。Patch 4 经 v1→v2→v3 三版迭代,最终已合入 for-7.3。