sched discussion
[PATCH 6.18 001/250] KVM: s390: pci: Fix resource leak on IRQ registration failure
LLM 分析
Linux 6.18.45-rc1 stable 评审:scheduler 子系统相关补丁分析
系列概况
- 标题:
[PATCH 6.18 000/250] 6.18.45-rc1 review - 作者:Greg Kroah-Hartman- 版本:Linux 6.18.45-rc1 stable- 规模:250 个 patch(其中 scheduler 相关约 5 个),加 14 封回复邮件
- 修改文件:跨多个子系统(sched、net、ovpn、xfs、bpf、drm 等)
- 代码统计:单 patch 通常 1–20 行,整体数千行
- Message-ID(首发):
20260817132536.466235697@linuxfoundation.org - 完整性:完整,250 patch 全部展开
来源虽然是 sched 频道,本质是 stable 分支大规模 cherry-pick;scheduler 子系统相关 patch 占少数但包含两个相对重要的修复。
补丁目的
把上游 mainline / linux-next 中已经验证过的关键修复回移植入 6.18 stable 分支,保证发行版用户拿到稳定的 6.18.45-rc1 内核。其中 scheduler 部分目标:
- 修正在 EEVDF 调度器中的 vruntime/vlag/vprot 计算与权重调整逻辑;
- 修 PSI 子系统在 cgroup 销毁时的 timer 关闭顺序问题;
- 修 sched_ext NUMA selftest 在任务睡眠后 affinity 变化导致的崩溃。
旧流程的问题
- EEVDF 旧实现:
place_entity()在cfs_rq->curr != se时假设avg_vruntime()不包含新实体;但因为avg_vruntime()永远包含cfs_rq->curr,导致重权重(reweight)过程中 vlag 缩放错误,调度滞后。Peter Zijlstra 上游 commit 6d71a9c61604 的"修复"被证实是基于错误前提。 - PSI 旧流程:
psi_cgroup_free()销毁 cgroup 时,rtpoll_timer未显式关闭,可能在销毁后还在跑;同时psimonkthread 在持有cgroup_mutex时被创建,引发 lockdep警告。 - sched_ext NUMA selftest 旧路径:
numa_select_cpu()直接用scx_bpf_task_cpu(p)取节点号,但睡眠任务 wakeup 前task_cpu可能落在p->cpus_ptr之外,导致scx_pick_*_cpu_node()返回 -EBUSY,scheduler 异常退出。
新流程
- EEVDF:把
vlag与vprot从 union 拆开成两个独立字段(patch 003),并通过rescale_entity()集中处理权重变化时的 vlag/deadline/vprot 重缩放(patch 004),回退 6d71a9c61604 的"修复"。 - PSI:在
psi_cgroup_free()中先timer_shutdown_sync(&rtpoll_timer);把psimonkthread 的创建移出cgroup_mutex临界区。 - sched_ext selftest:
numa_select_cpu()检测到task_cpu不在cpus_ptr时返回prev_cpu,避免在无可用 CPU 时崩溃。
Patch 概览
按 scheduler 相关 patch 排序:
| 序号 | 标题 | 作者 |
|---|---|---|
| 003/250 | sched/fair: Separate se->vlag from se->vprot | Ingo Molnar |
| 004/250 | sched/fair: Revert 6d71a9c61604 | Peter Zijlstra |
| 017/250 | selftests/sched_ext: Handle sleeping task affinity changes | Kuba Piecuch |
| 236/250 | sched/psi: Shut down rtpoll_timer in psi_cgroup_free() | Tejun Heo |
| 237/250 | sched/psi: Create the psimon kthread outside of cgroup_mutex | Tejun Heo |
关键实现
sched_entity 结构体里 vlag / vprot 不再共享同一份存储:
struct sched_entity {
/* Approximated virtual lag: */
s64 vlag;
/* 'Protected' deadline, to give out minimum quantums: */
u64 vprot;
...
};
重权重路径改走 rescale_entity():把 vlag、rel_deadline、vprot 全部按 old_weight/new_weight 缩放,再把 deadline 与 vprot 重新基于 avg_vruntime(cfs_rq) 锚定:
se->vlag = div64_long(se->vlag * old_weight, weight);
if (se->rel_deadline)
se->deadline = div64_long(se->deadline * old_weight, weight);
if (rel_vprot)
se->vprot = div64_long(se->vprot * old_weight, weight);
sched_ext NUMA selftest 关键判定:
if (cpu < 0 && !bpf_cpumask_test_cpu(task_cpu, p->cpus_ptr))
return prev_cpu;
PSI 修复则是显式关闭 timer:
static void psi_cgroup_free(struct cgroup *cgroup)
{
timer_shutdown_sync(&cgroup_psi(cgroup)->rtpoll_timer);
...
}
类比
EEVDF 的 vlag/vprot 重缩放像「银行账户换算汇率」:账户余额(vlag)必须按新旧汇率(权重)一致换算,否则会出现"今天存100、明天取时却变成 80"的错觉;如果在换算瞬间还把当天利息(avg_vruntime)误算进去,结果就更乱。把 vlag 和 vprot 拆成两个独立字段,等于把"活期账户"和"理财账户"分开记账,互不串扰。sched_ext 的 affinity 修复则像酒店前台:你给客人分配楼层时,若发现他手里拿的房卡楼层号已失效,就让他先回到原楼层(prev_cpu),而不是报错把他赶出去。
+---------------------------+
| cfs_rq->curr == se? |
+-----------+---------------+
|
no --> use entity_lag(V,v) --> se->vlag yes -> place_entity sees curr +------------------------+
| rescale_entity() |
| vlag *= w_old / w_new |
| vprot *= w_old / w_new |
| deadline *= w_old / w_new|
+------------------------+
Highlight:风险与注意点
- 风险1:vlag/vprot 拆字段后 struct
sched_entity占用略增;嵌入式或大量 task 的系统需留意 cache 占用。 - 风险 2:回退 6d71a9c61604 后,原报告者描述的 EEVDF 调度滞后现象可能再次出现,需配合 sched_feat 开关(如
PLACE_REL_DEADLINE)观察。 - 风险 3:sched_ext NUMA selftest 仅修测试用例,未必覆盖生产路径;如果生产代码也走类似路径,需要独立审计。
- 风险 4:PSI 关闭 timer 的顺序要求严格;cgroup 销毁路径竞争窗口需关注。
- 稳定版回退风险:6.18-stable 已经合并了 6d71a9c61604,回退意味着要在多个 commit 上做 conflict 解决(John Stultz 在提交信息中已标注"Resolved minor collision")。
版本变化
本系列仅展示从 mainline 回退到 stable 的差异,无 vN→vN+1 多版本。上游 commit:
80390ead2080(Ingo):vlag/vprot 拆字段101f3498b4bd(Peter):EEVDF 修复回退d4a00d61a5c2(Kuba):sched_ext NUMA selftest- Tejun Heo 的两个 PSI 修复(commit hash 未在原文给出)
一句话总结
Linux 6.18.45-rc1 stable 把 EEVDF 中 vlag/vprot 拆字段并回退先前的"修复"、PSI cgroup 销毁 timer 关闭、sched_ext NUMA 测试健壮性等改动一并 cherry-pick,目的是把 mainline 已经收敛的调度器修复下沉到发行版。