0/1 已展开

LLM 分析

Deadline Scheduler:让 SUGOV 特殊 DL 实体在 bandwidth move 中也被排除

系列概况

  • 标题:[RESEND PATCH] sched/deadline: Exclude special DL entities from bandwidth moves
  • 作者:Guopeng Zhang <zhangguopeng@kylinos.cn>
  • 版本:RESEND,单版本单 patch
  • 规模:1 个文件,1 处新增,1 处删除
  • 修改文件:kernel/sched/deadline.c
  • 代码统计:kernel/sched/deadline.c | 2 +-
  • Message-ID:20260713105739.3396340-1-guopeng.zhang@linux.dev
  • 完整性:完整,含 Reviewed-by Christian Loehle(Arm)、Acked-by Juri Lelli(Red Hat)、Signed-off-by Guopeng Zhang(Kylinos)

补丁目的

SUGOV(SchedUtil Governor,cpufreq 的调度器驱动策略)会在调度层创建若干 special DL 实体,用来"摆样子"地表达 CPUFreq 的频率请求。它们使用假/未被实际消耗的 bandwidth。

当前内核在多处已经把这些 SUGOV special DL 实体排除:

  • 常规 DL 准入控制(admission control)
  • 亲和性准入检查(affinity admission checks)
  • runqueue 带宽核算(rq bandwidth accounting)
  • root-domain 重建时的带宽核算(root-domain rebuild accounting)

dl_task_needs_bw_move() 漏掉了同一处排除。结果是:当 special DL 实体的亲和性 mask 不再与源 root-domain 相交时,set_cpus_allowed_dl() 和 cpuset attach 会错误地把它当成"需要执行 root-domain bandwidth move"的 DL 任务,触发本不该走的带宽搬移与重算。

补丁目标:让 special DL 实体在 bandwidth move 决策中也免检,与其他 special entity 处理路径保持一致。

旧流程的问题

       cpuset / set_cpus_allowed_dl
                  |
                  v
       if (!dl_task(p))
                  |
                  v
       dl_task_needs_bw_move(p, new_mask)
                  |
                  v
   return !cpumask_intersects(rd->span, new_mask)
                  |
                  v
       [BAD] Triggers root-domain bandwidth move
       for SUGOV special DL entity

关键问题:dl_task_needs_bw_move() 只判断"是不是 DL 任务 + 新 mask 跨不跨 root domain",没有判断"是不是 SUGOV special 实体"。

新流程

       cpuset / set_cpus_allowed_dl
                  |
                  v
       if (!dl_task(p) || dl_entity_is_special(&p->dl))
                  |
        +---------+---------+
        |                   |
    [special]           [normal DL]
        |                   |
    skip bw move    dl_task_needs_bw_move
                       |
                       v
              cpumask_intersects check
                       |
                       v
              triggers real bw move

关键实现

改动只有一行(diff stat:1 file changed, 1 insertion(+), 1 deletion(-)),落在 kernel/sched/deadline.cset_cpus_allowed_dl()(line 3354 附近):

 static void set_cpus_allowed_dl(struct task_struct *p,
                                  const struct cpumask *new_mask)
 {
-    if (!dl_task(p))
+    if (!dl_task(p) || dl_entity_is_special(&p->dl))
 }

逻辑含义:当任务是 deadline 任务,但又是 SUGOV special entity(dl_entity_is_special() 为真)时,直接跳过 dl_task_needs_bw_move() 触发的 root-domain 带宽核算流程。

类比

把 SUGOV special DL 实体想成电影院里自带占座道具的"假观众":

  • 他们拿着和真观众一样的座位票(DL task 的 sched_class),但实际上并不坐在那里看电影(不消耗真实 bandwidth)。
  • 检票闸机、座位计数、楼层统计都已经识别出"这是假观众",不再把它算进真正的客流里。
  • 唯一漏掉的一台闸机是"跨楼层换厅核算机"——它只要看到换厅的人就重新算一遍座位,结果把假观众也搬了一遍。

补丁就是给这台闸机加一条规则:"如果是带占座道具的假观众(special entity),请直接放行,不要启动换厅核算。"

Highlight:风险与注意点

  • 行为一致性是核心收益:让 special DL 实体在所有带宽相关路径(admission / accounting / move)都被一致排除,避免"一半路径走对、一半走错"的隐性 bug。
  • dl_entity_is_special() 判定成本极低:本质是一个标志位检查,开销可忽略,不会影响正常 DL 任务的 hot path。
  • cpuset attach 与 set_cpus_allowed_dl() 的耦合:补丁同时影响两条路径,未来若再有"需要排除某种特殊 DL 子类"的逻辑,应在两个入口都保持一致。
  • 回归测试方向:可在 cpufreq governor 为 schedutil 的机器上做 cpuset 联动测试,把一个 CPU 从一个 cpuset 移到另一个,观察 root-domain 的 bandwidth 重建计数,确认 special entity 不再触发 move。
  • 审查/认可链:已拿到 Christian Loehle(Arm DL scheduler reviewer)的 Reviewed-by 和 Juri Lelli(Red Hat scheduler maintainer)的 Acked-by。
  • RESEND 含义:标题里的 [RESEND] 表示这是之前发过的同一 patch 重发,通常是上游没有明确反对意见、作者再次推送争取被合入。

版本变化

本 patch 仅单版本,无 vN→vN+1 对照。

一句话总结

这个一行补丁把 SUGOV special DL 实体从 dl_task_needs_bw_move() 触发的 root-domain bandwidth move 流程中也排除掉,使所有 SUGOV special entity 处理路径保持一致,避免 cpuset/affinity 变更对"假观众"无意义地触发带宽搬移与重算。