0/1 已展开

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.hstruct 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 的实现路径大致是:

  1. pick_next_task_fair / put_prev_task_fair 检测 prev == next 的同任务场景;
  2. struct rq 增加一个 hrtick_rearm_fair 标志字段,作为"下一次进入 __hrtick_start_fair 时需要重新 arm"的信号;
  3. 在 hrtick 处理入口读取该标志并执行 hrtimer_rearm
  4. 消费完成后清零标志位。

但 kbuild 报告 struct rq 中根本没有 hrtick_rearm_fair 成员,提示 patch 漏改(或基于过时的 base tree)了 kernel/sched/sched.hstruct 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。