sched discussion
[PATCH v2] sched/cache: Fix a thread aggregation conflict when there is one runnable task
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 平台上的可用性。