0/5 已展开

LLM 分析

sched/cache:单可运行任务下 migrate_llc_task 与 sched_asym 的冲突修复

系列概况

  • 标题:[PATCH] sched/cache: Fix a thread aggregation conflict when there is one runnable task
  • 作者:Chen Yu;讨论参与者包括 Zhan Xusheng、Chen, Yu C 和 Tim Chen
  • 版本:v1;邮件未提供具体内核版本号
  • 规模:1 个 patch,4 封回复,共 5 封邮件
  • 修改文件:kernel/sched/fair.c
  • 代码统计:5 行新增、1 行删除
  • Message-ID:首封为 20260727012914.229171-1-yu.c.chen@intel.com
  • 完整性:完整讨论链路;包含补丁说明、ITMT 场景分析、对称路径检查,以及 SD_ASYM_CPUCAPACITY 相关后续讨论

补丁目的

在启用 ITMT(Intel Turbo Boost Max Technology)的系统上,PKG domain 可能设置 SD_ASYM_PACKING。此时,sched_balance_find_src_rq() 中的 sched_asym() 判断会拒绝从高优先级 CPU 向低优先级 CPU 拉取唯一可运行任务。

这会错误拦截 migrate_llc_task:即使任务希望迁移到其首选 LLC 以获得 cache locality,load balancer 仍可能因为 asym priority 规则而拒绝迁移,导致任务长期停留在错误的 LLC 中。

补丁为 migrate_llc_task 增加例外,使其能够绕过该单任务 sched_asym 过滤。

旧流程的问题

source CPU: high priority, task prefers target LLC
                         |
                         v
        sched_asym(PKG, source, destination) == true
                         |
                         v
              nr_running(source) == 1
                         |
                         v
                    continue
                         |
                         v
       migrate_llc_task is blocked
       task remains in the wrong LLC

当源 rq 只有 1 个 runnable task 时,原有逻辑为了避免从高优先级 CPU 拉取任务,会执行 continue。但这一保护没有区分迁移类型,因此连以 cache locality 为目标的 migrate_llc_task 也被一并拒绝。

该问题由 commit e4c9a4cb244a 引入的 migrate_llc_task 能力暴露出来。

新流程

source CPU: high priority, task prefers target LLC
                         |
                         v
      check sched_asym and nr_running == 1
                         |
             +-----------+-----------+
             |                       |
       asym is true           asym is false
             |                       |
   migration type is?              allow
             |
       +-----+----------------+
       |                      |
migrate_llc_task          other migration
       |                      |
 allow and continue       apply old filter
       v
task moves to preferred LLC

只有 migrate_llc_task 被豁免;普通 migrate_taskmigrate_misfit 等迁移仍遵守原有 sched_asym 规则。

Patch 概览

file: kernel/sched/fair.c
function: sched_balance_find_src_rq()

before:
if (sched_asym(env->sd, i, env->dst_cpu) && nr_running == 1)
        continue;

after:
if (sched_asym(env->sd, i, env->dst_cpu) && nr_running == 1 &&
    env->migration_type != migrate_llc_task)
        continue;

关键变化是增加:

env->migration_type != migrate_llc_task

当迁移类型为 migrate_llc_task 时,即使 sched_asym 为真且源 rq 只有一个 runnable task,也不会跳过该源 rq。

关键实现

lb_env 已经携带 migration_type,因此无需新增结构或状态位。调用者只需在已有的 sched_asym 判断中增加类型判断:

if (sched_asym(env->sd, i, env->dst_cpu) && nr_running == 1 &&
    env->migration_type != migrate_llc_task)
        continue;

讨论进一步确认了两个方向的非对称行为:

  1. 正向 migrate_llc_task 仍然可以工作。任务不偏好源 LLC 时,目标方向的 nr_pref_llc_running 为 0,因此 alb_break_llc() 不会把这次迁移当成 LLC 破坏。
  2. 反向 asym pull 不会造成任务反复迁移。对于正在运行的唯一任务,普通 load balance 会在 task_on_cpu() 检查处拒绝迁移;active balance 则会因为 src_rq->nr_running <= 1 而阻断该路径。
  3. 对非运行任务,migrate_degrades_llc() 会经过 can_migrate_llc_task(),当结果为 mig_forbid 时拒绝离开首选 LLC。
  4. SD_ASYM_CPUCAPACITY 相邻的单任务过滤没有同步修改。理论上它也可能需要类似处理,但目前尚不清楚是否存在同时具备多个 LLC 和非对称 CPU capacity 的平台,因此作者计划在 changelog 中说明本次有意保留。

类比

把 CPU 想象成不同等级的物流站点,把任务想象成需要送到指定仓库的包裹。

普通 asym-packing 规则要求:高优先级站点正在处理的包裹,不能随意交给低优先级站点。但 migrate_llc_task 是一辆“指定仓库直达车”,它的目标是把包裹送到任务偏好的仓库,以提高后续取用效率。

补丁相当于在调度中心给直达车盖了一个例外章:即使起点是高优先级站点,只要这是 cache-locality 直达任务,就允许把包裹送到正确仓库。其他普通包裹仍然遵守原规则,不会因此全部放开。

反向也像仓库管理员检查一样:普通调度和主动平衡都有保护,因此包裹一旦到达首选仓库,不会被立即又拉回错误地点。

Highlight:风险与注意点

  1. 需要确认 migrate_llc_task 确实能在 ITMT、PKG domain 和多 LLC 平台上完成正向迁移,而不会误触发其他 asym-packing 机制。
  2. SD_ASYM_CPUCAPACITY 的相邻过滤仍保留。当前输入没有证据表明该路径已经造成实际错误,但未来出现同时具备多 LLC 和非对称 CPU capacity 的平台时,需要重新评估。
  3. cache_nice_tries + 1migrate_degrades_llc() 的失败次数逃生窗口;后续应结合真实负载验证它不会导致任务在首选 LLC 和非首选 LLC 之间反复迁移。
  4. 当前邮件没有提供自动化测试或具体平台运行结果,结论主要来自代码路径分析和 reviewer 讨论。

版本变化

本线程只有 v1,没有 v2 或其他补丁版本。后续邮件没有引入新的代码版本,只补充了对迁移对称性、active balance 路径和 SD_ASYM_CPUCAPACITY 保留原因的分析。

关联补丁:e4c9a4cb244asched/cache: Add migrate_llc_task migration type for cache-aware balancing)。本补丁修复的是该功能与既有 sched_asym 单任务过滤之间的交互冲突。

一句话总结

migrate_llc_task 绕过 sched_asym && nr_running == 1 的错误拦截,使任务能够迁移到首选 LLC,同时保留普通迁移和其他 asym 规则的原有行为。