sched discussion
[PATCH] sched/hrtick: Name the minimum slice and derive the rearm slack
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 中的 10000 与 5000 抽成 HRTICK_MIN_SLICE_NS、HRTICK_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_start中max_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 /hrtick在sched_entity上的使能位未发生交叉。 - 与
HRTICK_SCHED_REARM_HRTIMER这种 enum 紧邻,但本 patch 没有改动任何 enum 成员。
一句话总结
把 hrtick 子系统里裸写的 10000 / 5000 抽成两个命名宏并显式让余量 = 切片 / 2,可读性提升但行为不变,等维护者解释 5us 阈值的来源后再决定是否合入。