0/1 已展开

LLM 分析

sched/hrtick:命名最小切片并派生 rearm 阈值

系列概况

  • 标题: [PATCH] sched/hrtick: Name the minimum slice and derive the rearm slack
  • 作者: Liang Hao
  • 版本: 单封 patch,无版本号
  • 规模: 1 file changed, 7 insertions(+), 4 deletions(-)
  • 修改文件: kernel/sched/core.c
  • 代码统计: +7 / -4
  • Message-ID: 20260818151854.9193-1-haohlliang@gmail.com
  • 完整性: 只含一封 patch,无后续回复或 v2

补丁目的

这只是个 cleanup / 命名重构,不修改任何运行时行为:把 kernel/sched/core.c 里硬编码在 hrtick_needs_rearm / hrtick_start 中的 100005000 抽成 HRTICK_MIN_SLICE_NSHRTICK_REARM_SLACK_NS 两个宏,并把后者显式声明为前者的一半,让"最小切片"和"rearm 余量"的关系读名字就能看出来。

旧流程的问题

原来两处常数都裸写在算式里:

abs(expires - hrtimer_get_expires(timer)) > 5000;
delta = max_t(s64, delay, 10000LL);

数字含义要靠读注释 + 翻 git blame 才能拼出来,而且 5000 这个阈值当年是不是刻意被设成 10000 的一半、还是分开引入后又恰好对齐,从代码里完全看不出来。

新流程

+-----------------------+          +----------------------------+
| hrtick_start(rq, dly) |          | hrtick_needs_rearm(t, exp) |
| floor = max(d, MIN)   |          | drift = |exp - old|        |
|       (10us = MIN)    |          | rearm iff drift > SLACK   |
+-----------+-----------+          |       (5us = MIN/2)       |
            |                      +-------------+--------------+
            v                                    v
    program hrtimer >= 10us               reprogram hrtimer

两个常数通过派生关系明确耦合:HRTICK_REARM_SLACK_NS = HRTICK_MIN_SLICE_NS / 2,语义与旧实现完全一致。

Patch 概览

  • 在匿名 enum 上方新增两个 #define
  • hrtick_needs_rearm> 5000 替换为 > HRTICK_REARM_SLACK_NS
  • hrtick_startmax_t(..., 10000LL) 替换为 max_t(..., HRTICK_MIN_SLICE_NS),注释里 "shorter than 10000ns" 也改为 "shorter than the minimum hrtick slice"。

关键实现

+#define HRTICK_MIN_SLICE_NS   (10 * NSEC_PER_USEC)
+#define HRTICK_REARM_SLACK_NS (HRTICK_MIN_SLICE_NS / 2)
...
- abs(expires - hrtimer_get_expires(timer)) > 5000;
+ abs(expires - hrtimer_get_expires(timer)) > HRTICK_REARM_SLACK_NS;
...
- delta = max_t(s64, delay, 10000LL);
+ delta = max_t(s64, delay, HRTICK_MIN_SLICE_NS);

作者 commit message 明确写了 "No functional change"。

类比

这像在两个不相关的便签上各写一个数字"10"和"5"——后来读代码的人要靠注释把它们配对。现在改成同一个旋钮面板上的"最小切片 10us"和"rearm 余量 5us(=一半)",旋钮之间有了可视的联动关系,一眼能看出余量是切片的一半,而不用回去翻"5"这个数字的来历。

Highlight:风险与注意点

  • 作者在邮件正文里自问了一个关键点:5000ns 当年是刻意被选成 10000ns 的一半,还是独立的启发式? 该问题没有现成史料,可能需要 author 上溯原始 patch 或询问 Ingo/Peterz 等维护者,否则把"巧合"固化进宏可能扭曲原意。
  • 把"/ 2"写进宏定义意味着未来如果有人想把最小切片从 10us 调成别的值,rearm 余量会自动跟着走;但反过来——如果只想调 rearm 阈值、不想动最小切片——就要改宏而不是局部常量,迁移成本从 0 变成 1 处。
  • 没有行为变化,回退成本极低;但单独发这种 cleanup patch 收益小,建议并入更广泛的重构或由 maintainer 在 merge window 顺手收掉。
  • 注释里 "to prevent timer DoS" 这种描述未变;如果将来切片下限/余量与安全相关语义变化,需要同步更新注释,本 patch 没碰这块。

版本变化

无版本演进,本讨论仅包含这一封 v1 patch。

与其他系列关联

  • 与高分辨率 timer (hrtimer) 子系统的一般行为耦合;与 CFS bandwidth throttle / hrticksched_entity 上的使能位未发生交叉。
  • HRTICK_SCHED_REARM_HRTIMER 这种 enum 紧邻,但本 patch 没有改动任何 enum 成员。

一句话总结

把 hrtick 子系统里裸写的 10000 / 5000 抽成两个命名宏并显式让余量 = 切片 / 2,可读性提升但行为不变,等维护者解释 5us 阈值的来源后再决定是否合入。