[PATCH 0/2] sched: fix typos and repeated words in comments
sched: fix typos and repeated words in comments。Claude 分析失败,当前使用规则 fallback:该讨论被归为 bugfix,共 3 封邮件。
北京时间 2026-08-09 至 2026-09-07
最近同步:2026/09/07 18:31
sched: fix typos and repeated words in comments。Claude 分析失败,当前使用规则 fallback:该讨论被归为 bugfix,共 3 封邮件。
sched_ext: scx_qmap: Fix pending partition work handoff。Claude 分析失败,当前使用规则 fallback:该讨论被归为 bugfix,共 3 封邮件。
selftests/sched_ext runner 此前收到 SIGINT/SIGTERM 后只停止循环,但退出码仍只反映失败数,导致被中断的 run 也会返回 0。patch 将 main 末尾的判定改为 failed > 0 || exit_req,使中断也被视为失败;同时保留 failed 计数只统计实际跑过的测试。作者用 GDB 验证了四种信号投递场景。
selftests/sched_ext/hotplug.c 中 toggle_online_status() 只打印错误不返回错误码,导致 CPU 状态写入失败时测试无限挂死。patch 把函数改为返回 int,调用点通过 goto 跳出并在失败时清理 BPF 资源,同时把 status 默认值从 PASS 改为 FAIL,保证任何未走完的路径都被报告为失败。
sched_ext: Fix keep-last for sub-scheduler tasks and two scx_qmap placement loops。Claude 分析失败,当前使用规则 fallback:该讨论被归为 bugfix,共 11 封邮件。
Andrea Righi 发布的 18 patch 系列让 CONFIG_SCHED_PROXY_EXEC 与 CONFIG_SCHED_CLASS_EXT 可同时启用。新增 SCX_OPS_ENQ_BLOCKED 让 BPF 调度器显式接管被 mutex 阻塞的 donor;sched_ext 把 running/stopping、tick 带宽、curr 视角等从 rq->curr 改为 rq->donor。系列同时修复了 ops.running/stopping 配对错误、迁移禁用假性 WARN_ON、远端 DSQ 转移与 proxy 状态竞态等多个 correctness 问题,并新增...
本系列是 sashiko bot NMI-reject 审计的延伸工作,共两 patch:Patch 1 让 scx_locked_rq() 在 NMI 中返回 NULL,避免三个 "any" 类 kfunc 走错持锁路径;Patch 2 把 idle-search 临时 nodemask 由 preempt_disable() 改为 guard(irqsave)() 防止 IRQ 嵌套覆写。两处改动都在源头统一拦截而非分散守卫,已被 Tejun Heo 当日合入 sched_ext/for-7.4 分支。
该系列修复 sched_ext COMPAT kfunc 包装器在 sub-sched 错误路径上的 NULL 指针解引用:BPF_PROG_TYPE_SYSCALL 或 ops.enqueue/dispatch 上下文对已退出或 idle 任务调用 scx_bpf_select_cpu_and() / scx_bpf_dsq_insert_vtime() 时会 oops。三版迭代后改为在 RCU 下安全读取 p->scx.sched,读到就 scx_error(),读不到就静默拒绝;已被 Tejun Heo 应用到 sched_ext/for-7.3-fixes 并 backport 到 s...
本系列把 in_nmi() 检查从 scx_bpf_kick_cpu() 推广到所有 NMI 可达、且会取 rq/dsq/pshard 锁的 sched_ext kfunc,通过新引入的 scx_kf_allowed_ctx() 宏在 NMI 中走无锁 scx_error() abort,避免 tracing BPF 程序把 any 分类 kfunc 变成整机 hard-lockup 的入口。v3 经三轮 review 后被 Tejun Heo 应用到 sched_ext/for-7.4。
scx_group_set_idle() 原先每次写入 cpu.idle 都无条件调用 BPF 的 cgroup_set_idle 回调,违反 transition 语义,导致 BPF scheduler 误判重复事件。本补丁在该函数中加入 tg->scx.idle != idle 的短路条件,与已有的 scx_group_set_weight() 路径对称。v2 仅修复了 v1 Link: tag 缺失 @linux.dev 的问题;Tejun Heo 已合入 sched_ext/for-7.3-fixes,并把 sched_idle 改回 idle 以匹配当前分支。
Michal Blaszczyk 提交单行 patch,把 scx_idle_test_and_clear_cpu() 里的 __cpumask_clear_cpu 替换为原子版本,试图消除 idle_smts 共享 mask 上的并发 lost update。Sashiko 与维护者 Andrea Righi 均指出修复不完整,因为 cpumask_andnot / cpumask_or 仍是整字非原子 RMW,且原设计本就是有意为之的 best-effort。最终作者决定撤回该 patch,建议改为更系统的方案,例如 per-CPU mask 或加锁。
v3 系列由两片组成:1/2 在 ext.c 注释中显式写出 dsq_vtime 必须落在 2^63 窗口内的 rolling-cursor 约束;2/2 把 scx_flatcg 的 cgv_node_less() 由裸 < 改为 time_before(),避免 cvtime 回卷后早回卷的 cgroup 抢到 rbtree 头部、其余节点被卡死。v3 相对 v1/v2 删掉了原 kernel priq 比较器改动并把 Fixes tag 校准到 a4103eacc2ab,Tejun 已收下合入 sched_ext/for-7.4。
sched_ext sub-scheduler 在 disable 时先释放 scx_enable_mutex 再删 sysfs kobject,导致并发 enable 在同一 cgroup 上 kobject_add 撞 -EEXIST,把一个健康的调度器误杀。补丁把 kobject_del 移到 mutex_unlock 之前,与 root 路径对齐。
本系列把 sched_ext 中 dsq_vtime 排序所依赖的 u64 half-range 约束显式写进 scx_bpf_dsq_insert_vtime() 的文档,并把示例调度器 scx_flatcg 的 rbtree 比较器 cgv_node_less() 从裸 u64 '<' 改成 (s64)(a-b)<0 的循环比较,避免 cvtime 绕回时破坏严格弱序。Tejun 复审指出文档措辞应为 'less than 2^63 apart',wrap 实际比 commit 描述发生得更早(每 CPU slice charge 累加),lag 与 lead 都需受限,Fixes 标签应...
Tao Cui 发现 scx_group_set_idle() 不论 cpu.idle 是否真发生变化都向 BPF 调度器派发 cgroup_set_idle 回调,会让基于切换或累计计数的 BPF 调度器误把重复写入算成多次跃迁。补丁在派发条件中追加 tg->scx.sched_idle != idle 的守卫,对齐 scx_group_set_weight() 的现有跳过等值写入的做法。Sashiko AI 提示 sched_idle 字段可能不存在;Andrea Righi 确认其余内容 OK 并给出 Reviewed-by,同时指出 Link: 标签为空。
Tao Cui 提交 2 个补丁分别修复 sched_ext 内核 DSQ 优先队列的 spread 大时反转问题,以及 scx_flatcg cgroup 树在 cvtime 环绕瞬间的错位问题。两处采用相反修复,判定依据是 spread 不变量是否被维护。Tejun Heo 明确 dsq_vtime 按 BPF kfunc 文档是循环 cursor,作者本人随后在第 9 封反对自己的 Patch 1 方向,预计 v2 会撤回 Patch 1 并修正 Patch 2 的 Fixes tag。
并发写 cgroup knob(weight/idle/bandwidth)时,核心调度器在自己的锁内更新 tg,但 sched_ext 通知要等锁释放后才异步进行,导致两次并发的通知乱序完成,core/BPF/sched_ext.cache 三者值不一致。补丁在每个 task_group 上加一把 knob_mutex,把核心调度器更新和 sched_ext 通知绑成原子事务。维护者 Tejun Heo 在回信中倾向 Michal Koutný 的另一种修法(把 fair 锁直接提升到 core 写 handler),所以这版很可能被替代。
作者把 fair.c 中的 shares_mutex 抬到 kernel/sched/core.c,拆出 _locked 版本,让 cpu.shares / cpu.weight / cpu.idle / cpu.max 等写路径在 cpu_weight_mutex / cpu_max_mutex 保护下同时串行化 CFS 与 SCX 回调,避免并发写造成 tg->shares 与 tg->scx.weight 互不相等的 bug。Tejun Heo 已 Acked 并请 Peter 接收。
这个 v3 两件套修复了 scx_cgroup_init_args 漏传 cgroup 初始 cpu.idle 状态的 bug:1/2 在结构体里新增 sched_idle 字段并在四个填充点补齐赋值,已带 Fixes tag 进入 for-7.3-fixes;2/2 把容易与 CPU idle 混淆的 tg->scx.idle 字段重命名为 tg->scx.sched_idle,作为独立 cleanup 进入 for-7.4。Andrea给了 Reviewed-by,Tejun 直接接收,整体改动小但语义正确。
David Carlier 提交单 PATCH,为 sched_ext 工具头文件中的 prolog 迁移探测补上 cid-form 调度器的入口 bpf_scx_reg_cid(),并把默认标志 __scx_prolog_disables_migration 由 true 翻为 false,使未挂 probe 的 loader 落到注释声明的 safe 方向。Tejun Heo 回复指出默认值翻转已在 scx 仓库以 888a907d84b5 合入,要求把后续改动走 scx 仓库流程而非 kernel 镜像。
Tejun Heo 在 v7.3-rc1 前发出 sched_ext fixes pull request:修复 dispatch queue move 与任务退出/切换 sub-scheduler 之间的 race,放开 ops.cgroup_set_bandwidth() 的 sleepable 限制并新增 capability 标记,同步 scx tooling 头,修正示例调度器的 timer re-arm 失败与 cgroup migration 时 vtime 信用丢失,补全 finish_dispatch() kernel-doc 与 sched-ext.rst 文档。pr-tr...
Liang Luo 提交一个 2 行的 kernel-doc 补丁,给 finish_dispatch() 新增的 @slice 和 @vtime 参数补上描述,解决 scripts/kernel-doc 报出的两条 "function parameter not described" 警告。文案与 dispatch_to_local_dsq() 保持一致,函数体未动。Sashiko 自动评审基于旧树误报 "Excess function parameter",作者用本地 kernel-doc 复测证明警告已清零。Tejun Heo 已 applied 至 sched_ext/for-7.3-...
Wanwu Li 提交一个纯注释 patch,把 sched_ext 里四处指向错误或拼错的函数名改为 __setscheduler_class()、bpf_iter_scx_dsq_new() 和 set_next_task_scx()。Zhan Xusheng 通过全树 grep 双向验证后给出 Reviewed-by,并指出 changelog 只列了 3 个重命名而 diff 实际改了 4 处。Tejun Heo 在把第一处注释块重新折行至 80 列内后,将补丁合入 sched_ext/for-7.3-fixes。
Wanwu Li 一次性提交 3 个 patch,修复 tools/sched_ext 下 scx_central、scx_qmap、scx_flatcg 三处 bug:前两者补全 bpf_timer_start() 的返回值检查并让 PIN 标志跟随 timer_pinned,后者把机械迁移到 time_delta() 丢掉的 vtime 有符号偏移用 (s64) 减法恢复。Tejun Heo 已 Applied to sched_ext/for-7.3-fixes,并对 scx_central 描述中的 Fixes 归属做了微调(指向 start_central_timer() 而非 ce...
Tao Cui 的 v2 补丁在 scx_cgroup_init_args 中新增 idle 字段,并补齐四处构造 args 的位置,使 BPF 调度器在 init 阶段即可看到 cgroup 的初始 idle 状态。Andrea Righi 建议补 Fixes tag 并给出 Reviewed-by;Tejun Heo 指出 idle 在 sched_ext 中专指 CPU idle,要求 v3 把字段改名为 sched_idle 并同步重命名 tg->scx.idle,作者已确认照办。
sched_ext 用户态调度器默认通过 fentry 自动挂载 scx_lib_init_probe;当内核未开启 CONFIG_FUNCTION_TRACER 时,fentry 无法 attach,而 skel__attach() 是 all-or-nothing 语义,会把整套调度器一起拖垮。本补丁在 SCX_OPS_LOAD() 中用 /proc/sys/kernel/ftrace_enabled 的存在性作为运行时代理,不可用时关闭该探针的 autoload,并在 attach 后的 struct_ops 关联循环里放过 autoload 已关闭的程序,从而让 CONFIG_FUNC...
Tao Cui 给 scx_cgroup_init_args 增加了 bool idle 字段,并在 scx_tg_online() 与 scx_cgroup_init() 两个构造点把 tg->scx.idle 透出给 BPF scheduler,修复已 idle 的 cgroup 在 sched_ext 挂载时被错误呈现为非 idle 的问题。Sashiko 自动评审进一步指出 kernel/sched/ext/sub.c 中 sub-scheduler 路径未同步更新该字段,是中等级别的潜在遗漏。
Tejun Heo 提交一个 2 patch 系列,把 scx 用户态仓库对 BPF 头文件的修复反向同步回内核树:新增 enum ABI 回查表让 64-bit enum 在老 BTF 上不再截断;改写 is_migration_disabled() 适配 v6.18+ 不开 PREEMPT_RCU 的场景;恢复 __COMPAT_scx_bpf_cpu_curr 兼容旧内核;文档化 rq clock 在 NO_HZ_IDLE 下的 stale-read。评审指出默认 __scx_prolog_disables_migration = true 的语义与注释不符,慢路径里会导致对 curre...
sched_ext 在 scx_dsq_move() 中对任务做所有权检查的位置过于靠前,会把任务临时离开/换主的良性竞态误判为越权并终止整个 BPF scheduler。补丁把该检查推迟到拿到 src_dsq 锁且确认任务仍在源 DSQ 之后,仅当 lock 下仍可见却不再属于当前 scheduler 时才真正 abort,保留错误信息文案不变以便兼容。同时顺手修正两处仍引用已重命名的 sched_ext_free() 的注释。
Changwoo Min 提交单补丁,在 scx_group_set_bandwidth() 中新增 scx_cgroup_set_bw_mutex,把 SCX 回调与 tg->scx.bw_* 写入包在互斥区,与 CFS 一侧的 cfs_constraints_mutex 对齐,避免并发 cpu.max 写导致的乱序和撕裂。Sashiko AI 评审指出该锁在 percpu rwsem 读侧获取可能引起调度饥饿,并提醒 cpu.weight/cpu.idle 等同类属性仍缺乏串行化;Tejun 与作者的回复在抓取中被截断,需回拉原文确认进一步指导。
Liang Luo 发出一组 2 份的 sched_ext 文档 patch:cgroup-v2.rst 为 cpu.max / cpu.max.burst / cpu.idle 补上 cgroup_set_bandwidth 与 cgroup_set_idle 回调的影响说明;sched-ext.rst 的 ops.exit() 示例把不存在的 ei->type 改回结构体真实字段 ei->kind。经 Tejun 指出前言 bullet 仅覆盖 cgroup_set_weight,作者在 v2 把 bullet 泛化为对应 cgroup_set_*,最终两条都被合入 sched_ext/f...
本系列修复 cgroup cpu.* 文件并发写导致的 CFS 与 sched_ext 状态发散。v1 在 core 层新增 scx_cgroup_mutex 串行化写路径;经 Tejun 与 Peter 评审后,v2 把 fair.c 已有的 shares_mutex 提升到 core 层,并新增 sched_group_set_shares_locked(),让 CFS 与 SCX 在同一锁下原子完成,避免嵌套加锁。线程仍在修订中,v3 需回应命名建议并补回归测试。
scx_nest 在 nest_select_cpu() 的 migrate_primary 分支里调用 bpf_timer_cancel(),但 select_cpu() 处于 p->pi_lock + IRQ-disabled 上下文,无法同步取消定时器。补丁改为清 scheduled_compaction 标志、让 timer 回调自检作废,并把 stat_inc(CALLBACK_COMPACTED) 移到 stale 检测之后,避免悬挂到期被误计为 compact。
Tejun Heo 提交一封 26 行的 BPF verifier 补丁,把 sched_ext 四个 ops 参数结构体(scx_init_task_args / scx_cpu_release_args / scx_sub_attach_args / scx_sub_detach_args)里的指针字段加入 BTF_TYPE_SAFE_TRUSTED 白名单,使 sleepable 程序能直接使用 PTR_TRUSTED 指针,例如把 args->cgroup 直接传入 bpf_cgrp_storage_get()。CI bot 提示补 Fixes tag,BPF 维护者 Kumar Ka...
Tejun 的 6 补丁系列修复 sched_ext 自 4c95380701f5 以来 core scheduling 支持被破坏的问题:fold 让 dispatch 从 pick 内丢 rq 锁,导致同核 sibling 选择互相覆写 core_pick 等状态引发 oops / hang。补丁新增 lock_drop_seq 计数、把"保留 prev"从 rq flag 改成 verdict 返回、修正 kfunc 中 this_rq 假设、让 core-sched pick 在丢锁时整段重试,并由 Peter Zijlstra 与 Andrea Righi 评审,已合入 sched_...
本补丁把 sched_ext 的 ops.cgroup_set_bandwidth() 加入 bpf_scx_check_member 的 sleepable 白名单,因其调用路径(tg_set_bandwidth → scx_group_set_bandwidth)本就持有可睡眠的 percpu_rwsem 读端。同时引入 DEFINE_SCX_COMPAT_MARKER 宏和首个 marker(scx_compat_marker_cgroup_set_bandwidth_may_sleep),通过 __used __retain 保证 BTF 留存,让 userspace loader 能...
Andrea Righi 发布 v12 patch series,让 proxy execution 与 sched_ext 不再在 Kconfig 层互斥:把 donor/owner 拆为 rq->donor 与 rq->curr,新增 SCX_OPS_ENQ_BLOCKED 让 BPF 调度器显式接纳 mutex-blocked donor,并修复 NOHZ tick 检查、set_task_cpu 误报警、ops.running/stopping 配对以及跨 rq DSQ 迁移中的代理竞争。系列包含 17 个 patch、新增 enq_blocked kselftest 与 scx_qm...
本系列把 sched-ext/scx 仓库 compat.bpf.h 的两处修复同步进内核树:给 lockless scx_bpf_dsq_peek() 加内核 ≥ 7.1.0 版本门以规避 v7.1 之前的 FIFO DSQ peek bug,并新增 scx_bpf_reenqueue_local_from_anywhere() 兼容 helper,让 tracepoint 等任意上下文能统一调用 v7.1 通用 dsq_reenq() 或 v6.19 v2 reenqueue-local。Tejun 已逐 patch 指出 Patch 1 commit message/注释把 v6.19 ...
Tejun Heo 推送 4-patch PATCHSET,修掉 scx_prio_less() 反向调用 ops.core_sched_before()、core_sched_at 两套时间戳规则不兼容、跨 sub-scheduler 没有调度者仲裁等三处 core-sched 优先级排序 bug,并删除一段永远不会触发的 SCX_DEQ_CORE_SCHED_EXEC 死代码。补丁已在作者自己的回复中 Applied 到 sched_ext/for-7.3,目标是在 7.3 merge window 前把 sub-scheduler 的核心坑补齐。
kernel/sched/ext/arena.c 使用 gen_pool_* 接口,但 SCHED_CLASS_EXT 缺少 GENERIC_ALLOCATOR 的 select。当配置里无其他项选中 GENERIC_ALLOCATOR 时会出现 undefined reference。补丁在 kernel/Kconfig.preempt 增加一行 select GENERIC_ALLOCATOR,修复链接错误,已被 Tejun Heo 立刻合入 sched_ext/for-7.3。
scx_flatcg 的 fcg_cgroup_set_weight() 写完 cgc->weight 和 child_weight_sum 后没推进 hweight_gen,导致持续忙碌的 cgroup 内 cpu.weight 改动对调度不可见。补丁在解锁后原子自增 hweight_gen,使 cgrp_refresh_hweight() 下次按新权重重算 hweight。Tejun 已拣入 sched_ext/for-7.3,并顺手指出了 fcg_dispatch() true-up 的另一处 bug,待后续修复。
Tejun Heo 提交了 3 个补丁清理 4c95380701f5 引入的 dispatch 路径改动。0001 在 put_prev_task_scx() 入口拒绝跨 CPU 执行 kick_sync_wait_bal_cb,修复 dispatch drop rq lock 窗口内 lock 持有者 flush 回调到外 CPU 导致潜在死锁的回归。0002 删除 verdict 以返回值传递后已过时的 SCX_DSP_PREV 降级兜底,0003 把 balance_one()/SCX_RQ_IN_BALANCE 改名对齐到 dispatch 语义。该系列已被 maintainer 直接...
Tejun Heo 在 sched_ext/for-7.3 分支上合并两个无关小补丁:一是删除 scx_root_disable() 中无锁的 scx_rq_clock_invalidate(),避免与持锁 flags 更新 race 同时去除冗余失效;二是让 scx_bpf_events() 读取调用者 BPF 程序所属 scheduler 的事件计数器,使 sub-scheduler 能正确观测自身。
Tao Cui 修复 scx_flatcg 在切片到期或 DSQ 空时 true-up cgroup cvtime 的计算 bug:原表达式 (cur_at + slice - now) 符号反,且 CNS_EXPIRE 路径下 u64 减法下溢、BPF 无符号除法丢失补码符号位,导致每次过期向 cvtime_delta 加接近 2^64/hweight 的垃圾值。新代码先算 s64 delta、按正负分流到 fetch_and_add / fetch_and_sub,被除数保正以适配 BPF 无符号除法。Sashiko 提示 cgv_node_less() 的 cvtime 回卷优先级反转属...
这个 PATCH 修复 sched_ext 中 process_deferred_reenq_users 在 DSQ 已被 destroy_dsq 销毁后仍触发 BUG_ON 的崩溃。v2 把检查从 builtin-flag 改为只跳过 SCX_DSQ_INVALID,并在 Tejun 应用时加 READ_ONCE 关闭 TOCTOU 窗口。Sashiko 还提示 dsq 指针本身的 UAF 风险尚需继续跟进。该 patch 已合入 sched_ext/for-7.3 并会回灌 stable v7.1+。
Tao Cui 提交一条 sched_ext 单文件补丁,希望在 scx_cgroup_task_migrated() 里跳过 SCX_TASK_DEAD 的任务,防止 scx_rehome_task() 误操作并泄漏 BPF per-task 资源。Tejun Heo 指出 MIGRATED 回调全程在 cgroup_attach_lock write-held 下执行,集合内任务根本无法进入 exit 路径,DEAD 只可能在没有 threadgroup rwsem 的 scx_task_iter 路径里出现,窗口不存在。作者在第 3 封回复中认错,patch 预计不会合并。讨论同时提醒:...
scx_bpf_dsq_reenq() 排出的延迟 reenq 可能在运行前被 destroy_dsq() 销毁,导致 process_deferred_reenq_users() 走到 BUG_ON。v1 把 BUG_ON 换成 if (builtin) continue;Tejun 指出范围过宽,v2 改为只对 SCX_DSQ_INVALID 跳过,其它 builtin 状态仍 BUG_ON。
本补丁修复 selftests/sched_ext 中 ddsp_bogus_dsq_fail 与 ddsp_vtimelocal_fail 在繁忙系统上跳过核心断言的 flaky 问题。原代码把非法 dispatch 包在 if (cpu >= 0) 里,一旦 scx_bpf_pick_idle_cpu() 返回负错误码就直接 return prev_cpu,导致测试空跑却报通过。补丁改为失败时兜底到 prev_cpu 并无条件执行非法 dispatch。Tejun Heo 已应用到 sched_ext/for-7.3,并把描述中的 "returns -1" 更正为 "returns a n...
selftests/sched_ext/numa.bpf.c 之前断言被选中的 idle CPU 仍在 idle cpumask 中,但 pick_idle_cpu_node 与 pick_any_cpu_node 路径都存在窗口期,导致 race。补丁改用本地 CPU 的不变式:如果当前 CPU 跑在非 idle task context 中,则其自身不应仍在节点 idle cpumask 里,与 allowed_cpus 修复同思路,已被 Tejun Heo 合入 sched_ext/for-7.3。
该 patch 修复 compat.bpf.h 中 scx_bpf_dsq_reenq___compat extern 多写了一个被 KF_IMPLICIT_ARGS 隐式省略的 bpf_prog_aux 参数,导致 libbpf 在所有内核上都无法 resolve 该 weak extern,__COMPAT_has_generic_reenq() 永远返回 false,scx_qmap 等通用 reenq 用户被误判为内核过旧。同时订正过时的 v6.20 注释为 v7.1,并加上 v7.1+ stable 后向移植标签。patch 本意发往 for-7.2-fixes,最终被 Tejun ...