0/264 已展开

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 部分目标:

  1. 修正在 EEVDF 调度器中的 vruntime/vlag/vprot 计算与权重调整逻辑;
  2. 修 PSI 子系统在 cgroup 销毁时的 timer 关闭顺序问题;
  3. 修 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 未显式关闭,可能在销毁后还在跑;同时 psimon kthread 在持有 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:把 vlagvprot 从 union 拆开成两个独立字段(patch 003),并通过 rescale_entity() 集中处理权重变化时的 vlag/deadline/vprot 重缩放(patch 004),回退 6d71a9c61604 的"修复"。
  • PSI:在 psi_cgroup_free() 中先 timer_shutdown_sync(&rtpoll_timer);把 psimon kthread 的创建移出 cgroup_mutex 临界区。
  • sched_ext selftestnuma_select_cpu() 检测到 task_cpu 不在 cpus_ptr 时返回 prev_cpu,避免在无可用 CPU 时崩溃。

Patch 概览

按 scheduler 相关 patch 排序:

序号标题作者
003/250sched/fair: Separate se->vlag from se->vprotIngo Molnar
004/250sched/fair: Revert 6d71a9c61604Peter Zijlstra
017/250selftests/sched_ext: Handle sleeping task affinity changesKuba Piecuch
236/250sched/psi: Shut down rtpoll_timer in psi_cgroup_free()Tejun Heo
237/250sched/psi: Create the psimon kthread outside of cgroup_mutexTejun 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 已经收敛的调度器修复下沉到发行版。