sched discussion
Re: [PATCH] sched/fair: Restart hrtick after same-task repicks
LLM 分析
sched/fair:同任务重选时重启 hrtick —— kbuild 编译失败回执
系列概况
- 标题:
sched/fair: Restart hrtick after same-task repicks - 作者:Shubhang Kaushik (Ampere)
<sh@gentwo.org> - 版本:v1(In-Reply-To 指向
20260813-sched-fair-hrtick-restart-v1-1-4230d1e18fbb@gentwo.org) - 规模:单 patch 系列
- 修改文件:依据 kbuild 报错定位,至少涉及
kernel/sched/fair.c(第 14885 行附近);一般会同时改kernel/sched/sched.h中struct rq定义 - 代码统计:本邮件正文仅为 0-day CI 自动回执,未复述 hunk,无法精确给出 +/- 行数
- Message-ID:
202608250340.cxCp0maB-lkp@intel.com - 完整性:原 patch 链接可访问,但本邮件未包含 patch 自身;分析需基于标题与报错反向推断
补丁目的
fair scheduler 在调度循环里经常出现"刚刚切走的任务又被再次 pick"的情况(同任务 repicks,例如 yield 之后又重新 pick_next_task 选中同一个 task)。
在这种情况下,hrtick(基于 hrtimer 的高精度调度 tick)原本应该在重新 pick 时重新 arm 一次以保证精度;否则一旦错过重新 arm 的窗口,rq->hrtick 可能处于"已调度但不需要触发"状态,从而同任务长时间独占 CPU,违反 CFS 关于抢占粒度的预期。
patch 目标:在检测到同任务被再次选中的路径里,主动 rearm hrtick,恢复高精度 tick 行为。
关键实现
报错信息明确指出 kernel/sched/fair.c:14885:7 引用了 rq->hrtick_rearm_fair,说明 patch 的实现路径大致是:
- 在
pick_next_task_fair/put_prev_task_fair检测prev == next的同任务场景; - 给
struct rq增加一个hrtick_rearm_fair标志字段,作为"下一次进入__hrtick_start_fair时需要重新 arm"的信号; - 在 hrtick 处理入口读取该标志并执行
hrtimer_rearm; - 消费完成后清零标志位。
但 kbuild 报告 struct rq 中根本没有 hrtick_rearm_fair 成员,提示 patch 漏改(或基于过时的 base tree)了 kernel/sched/sched.h 中 struct rq 的定义。
/* kernel/sched/fair.c:14885 area (inferred) */
if (same_task_repick) {
rq->hrtick_rearm_fair = 1; /* <-- compiler error here */
/* trigger __hrtick_start_fair later */
}
/* kernel/sched/sched.h: struct rq (expected) */
struct rq {
...
#ifdef CONFIG_SCHED_HRTICK
struct hrtimer hrtick_timer;
int hrtick_rearm_fair; /* missing in baseline */
#endif ...
};
类比
把 hrtick 想成咖啡店号码牌上的倒计时表(同任务 repick 相当于"号码没变")。
原本的设计假设:号码变了,新客人重新取号,倒计时自然重新开始。但 patch 想要的是:即使还是同一个号码(同任务 repick),也要把倒计时表拨回原位继续走。
rq->hrtick_rearm_fair 就是咖啡师手里的便签本,记着"下一位要重新拨表"。
报错则是:便签本还没有做出来(struct rq 没这个字段),咖啡师就跑去拨表了。
patch v1: sched/fair: Restart hrtick after same-task repicks
|
v
0-day CI tries to build kernel/sched/fair.c
|
v
Reference: rq->hrtick_rearm_fair (line 14885)
|
v
clang error:
"no member named 'hrtick_rearm_fair' in 'struct rq'"
|
v
kernel test robot auto report -> patch author + scheduler ML + lkp / llvm / oe-kbuild-all
Highlight:风险与注意点
- 编译失败:
rq->hrtick_rearm_fair字段未在struct rq中声明,作者需要补kernel/sched/sched.h中的字段定义,否则补丁根本无法落地。 - patch 陈旧:CI 标注 "linux-review patch is more than 7 days old, verify it wasn't already superseded",在出 v2 前需要核对最新 tip/sched/core 是否已经包含等价修复或字段已重命名。
- base tree 不一致:报错也可能源自 patch base 与 0-day 拉取的 tree 之间存在结构性差异(例如
struct rq已经历 refactor),作者需要确认 base。 - 维护者跟进:通常调度器维护者(Peter Zijlstra / Ingo Molnar 等)不会逐一回这种自动报告;真正阻塞的是作者重发 v2。
- 同任务 repick 触发条件本身的正确性需要 review:
prev == next的判定需要在抢占、迁移、newidle 几条路径都覆盖,否则仅在 fast path 上重启 hrtick 可能在迁移路径上失效。 - 后续验证点:v2 重发后建议同时跑 schbench / hackbench / will-it-scale latency,确认重新 arm hrtick 没有引入额外的 tick 抖动。
一句话总结
Intel 0-day CI 自动回执 patch v1 sched/fair: Restart hrtick after same-task repicks 编译报错 no member named 'hrtick_rearm_fair' in 'struct rq',作者需要补 struct rq 字段定义或刷新 base 后重发 v2。