sched discussion
[PATCH] sched/cache: Fix a thread aggregation conflict when there is one runnable task
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_task、migrate_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;
讨论进一步确认了两个方向的非对称行为:
- 正向
migrate_llc_task仍然可以工作。任务不偏好源 LLC 时,目标方向的nr_pref_llc_running为 0,因此alb_break_llc()不会把这次迁移当成 LLC 破坏。 - 反向 asym pull 不会造成任务反复迁移。对于正在运行的唯一任务,普通 load balance 会在
task_on_cpu()检查处拒绝迁移;active balance 则会因为src_rq->nr_running <= 1而阻断该路径。 - 对非运行任务,
migrate_degrades_llc()会经过can_migrate_llc_task(),当结果为mig_forbid时拒绝离开首选 LLC。 SD_ASYM_CPUCAPACITY相邻的单任务过滤没有同步修改。理论上它也可能需要类似处理,但目前尚不清楚是否存在同时具备多个 LLC 和非对称 CPU capacity 的平台,因此作者计划在 changelog 中说明本次有意保留。
类比
把 CPU 想象成不同等级的物流站点,把任务想象成需要送到指定仓库的包裹。
普通 asym-packing 规则要求:高优先级站点正在处理的包裹,不能随意交给低优先级站点。但 migrate_llc_task 是一辆“指定仓库直达车”,它的目标是把包裹送到任务偏好的仓库,以提高后续取用效率。
补丁相当于在调度中心给直达车盖了一个例外章:即使起点是高优先级站点,只要这是 cache-locality 直达任务,就允许把包裹送到正确仓库。其他普通包裹仍然遵守原规则,不会因此全部放开。
反向也像仓库管理员检查一样:普通调度和主动平衡都有保护,因此包裹一旦到达首选仓库,不会被立即又拉回错误地点。
Highlight:风险与注意点
- 需要确认
migrate_llc_task确实能在 ITMT、PKG domain 和多 LLC 平台上完成正向迁移,而不会误触发其他 asym-packing 机制。 SD_ASYM_CPUCAPACITY的相邻过滤仍保留。当前输入没有证据表明该路径已经造成实际错误,但未来出现同时具备多 LLC 和非对称 CPU capacity 的平台时,需要重新评估。cache_nice_tries + 1是migrate_degrades_llc()的失败次数逃生窗口;后续应结合真实负载验证它不会导致任务在首选 LLC 和非首选 LLC 之间反复迁移。- 当前邮件没有提供自动化测试或具体平台运行结果,结论主要来自代码路径分析和 reviewer 讨论。
版本变化
本线程只有 v1,没有 v2 或其他补丁版本。后续邮件没有引入新的代码版本,只补充了对迁移对称性、active balance 路径和 SD_ASYM_CPUCAPACITY 保留原因的分析。
关联补丁:e4c9a4cb244a(sched/cache: Add migrate_llc_task migration type for cache-aware balancing)。本补丁修复的是该功能与既有 sched_asym 单任务过滤之间的交互冲突。
一句话总结
为 migrate_llc_task 绕过 sched_asym && nr_running == 1 的错误拦截,使任务能够迁移到首选 LLC,同时保留普通迁移和其他 asym 规则的原有行为。