0/1 已展开

LLM 分析

sched/cache: 修复单任务时 migrate_llc_task 被 sched_asym 拦截的回归

系列概况

  • 标题: [PATCH v2] sched/cache: Fix a thread aggregation conflict when there is one runnable task
  • 作者: Chen Yu yu.c.chen@intel.com
  • 版本: v2
  • 规模: 单 patch
  • 修改文件: kernel/sched/fair.c
  • 代码统计: +5/-1(含 4 行注释)
  • Message-ID: 20260810033742.1688718-1-yu.c.chen@intel.com
  • 完整性: 输入仅含 1 封邮件;标题、正文、签名、修改统计完整

补丁目的

修复引入 migrate_llc_task(上游 commit e4c9a4cb244a "sched/cache: Add migrate_llc_task migration type for cache-aware balancing")之后,在 SD_ASYM_PACKING(如 Intel ITMT)平台上出现的回归。

load balancer 在 src CPU 上只剩 1 个可运行任务时被 sched_asym() 拒绝,导致 cache-aware 迁移无法完成,任务长期停留在非最优 LLC 上。补丁让 cache 局部性优先级高于 asym 优先级,给 migrate_llc_task 开一个例外。

旧流程的问题

sched_balance_find_src_rq() 遍历 src CPU 时执行:

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

含义是 "src CPU 比 dst CPU 优先级更高,且只剩 1 个任务,不让低优先级 CPU 抢走"。在 ITMT 拓扑下,dst CPU 虽优先级低,但位于任务偏好的 LLC 上,migrate_llc_task 仍然被这条规则一票否决,cache 收益拿不到。

新流程

仅当 migration_type == migrate_llc_task 时放行,其他 asym 迁移维持原策略;并补注释解释为何 SD_ASYM_CPUCAPACITY 暂不一起放开。

                sched_balance_find_src_rq()
                          |
                          v
                +-----------------------+
                | sched_asym(src,dst)? |
                |   && nr_running == 1  |
                +-----------+-----------+
                            |
                            v
        +--------------------------------------+
        | migration_type == migrate_llc_task ? |
        +-------+----------------------+-------+
        |  yes  |                      |  no   |
        v       v                      v       v +-----------+ +----------------+
   |  allow: let| |  continue;     |
   |  src task |            |  keep asym     |
   |  be pulled|            |  exclusive |
   +-----------+            +----------------+

关键实现

唯一的 diff 在 sched_balance_find_src_rq()

/*
 * For migrate_llc_task, skip this check: cache locality
 * outweighs the asym priority.
 */
if (sched_asym(env->sd, i, env->dst_cpu) && nr_running == 1 &&
    env->migration_type != migrate_llc_task)
        continue;

语义上等价于在原有"高优先级 + 单任务 -> 拒绝被拉走"判断后追加一个 migrate_llc_task 例外分支。

类比

把 PKG 域想成一栋办公楼,里面有"高级办公室"(高优先级 CPU)和"普通工位"(低优先级 CPU),原本规定"高级办公室只剩一人时,其他人不能占用"。

但有一位员工的工作必须紧贴机房(cache 局部性)才能保证速度,原本他就该搬到机房旁的工位 —— 之前由于规则过于刚性,他被锁在高级办公室,远程访问机房。

本补丁就是在规则里加一条特例 ——出于贴近机房原因的工位调动,规则放行。

Highlight:风险与注意点

  • 未同步放开 SD_ASYM_CPUCAPACITY:在 P-core/E-core 等 hybrid 平台上,CPU 性能差距太大,cache 共置收益很难抵消;当前选择保守,等出现真实反例再扩。
  • 过滤顺序与未来扩展:本补丁只放开了 PKG 上的 SD_ASYM_PACKING 路径,没有重新审视其他 asym 过滤;如果未来出现 migrate_llc_task 与其他 asym 类型叠加的场景,要确认 migration_type 判断位置是否仍然正确。
  • 回归验证点:建议在 ITMT + 多 LLC 拓扑上验证"src CPU 上仅剩 1 个任务"场景,确认 LLC 亲和性恢复,且普通 asym 负载均衡行为未受影响。

版本变化

  • v1 -> v2:根据 reviewer Zhan Xusheng 的反馈,在 commit log 中补充说明 SD_ASYM_CPUCAPACITY 暂不一起修改的原因,让后续读者不必再猜。

一句话总结

sched_asym() 过滤加一个 migrate_llc_task 例外,恢复 cache-aware balancing 在 SD_ASYM_PACKING 平台上的可用性。