0/2 已展开

LLM 分析

sched/fair:撤回删除 is_vm_hugetlb_page 检查的清理 patch

系列概况

  • 标题:[PATCH] sched/fair: remove the wrong check is_vm_hugetlb_page
  • 作者:Huang Shijie huangsj@hygon.cn
  • 版本:v1(单封 patch,作者同一天主动撤回)
  • 规模:1 file changed, 1 insertion(+), 1 deletion(-)
  • 修改文件:kernel/sched/fair.c(函数 task_numa_work(),约 4167 行附近)
  • 代码统计:删除 1 行条件片段,无新增函数/宏
  • Message-ID20260723073449.1945687-1-huangsj@hygon.cn
  • 完整性:完整 patch,但作者在第二封邮件明确请社区忽略,因此属于「作者自撤」的 cleanup patch

补丁目的

作者原本想清理 task_numa_work() 中一段看起来多余的 hugetlb 过滤。原代码的判断条件是:

if (!vma_migratable(vma) || !vma_policy_mof(vma) ||
    is_vm_hugetlb_page(vma) || (vma->vm_flags & VM_MIXEDMAP)) {
    trace_sched_skip_vma_numa(mm, vma, NUMAB_SKIP_UNSUITABLE);
    continue;
}

作者的论证:vma_migratable() 内部已经调用 hugepage_migration_supported(),对 hugetlb 映射做了严格检查;如果它返回 true,就代表这个 hugetlb 映射已经被认为「可迁移」,那么在调用方再用 is_vm_hugetlb_page(vma) 把它再过滤一遍就属于重复,会让本应参与 NUMA balancing 的 hugetlb VMA 被错误跳过。

旧流程的问题(作者当时的判断)

+-------------------------------------------+
|        task_numa_work() VMA scan         |
+-------------------------------------------+
                   |
                   v
        +---------------------+
        | vma_migratable() ?  |
        +---------------------+
            |            |
          false         true
            |            |
            v            v
         skip     +---------------------+
                 | vma_policy_mof() ?   |
                 +---------------------+
                    |            |
                  false         true
                    |            |
                    v            v
                 skip    +-------------------------+
                        | is_vm_hugetlb_page() ?  |
                        +-------------------------+
                              |          |
                            true       false
                              |          |
                              v          v
                           skip    +-------------------+
                                   | VM_MIXEDMAP ?     |
                                   +-------------------+
                                       |        |
                                     true     false
                                       |        |
                                       v        v
                                    skip   NUMA balance VMA

作者认为 is_vm_hugetlb_page() 这一格是多余的护栏,删掉它能让「已经被 vma_migratable() 判为可迁移的 hugetlb VMA」进入 NUMA balancing,享受自动迁移带来的访问局部性收益。

新流程(patch 设想)

+-------------------------------------------+
|        task_numa_work() VMA scan         |
+-------------------------------------------+
                   |
                   v
        +---------------------+
        | vma_migratable() ?  |
        +---------------------+
            |            |
          false         true
            |            |
            v            v
         skip    +---------------------+
                | vma_policy_mof() ?   |
                +---------------------+
                   |            |
                 false         true
                   |            |
                   v            v
                skip   +-------------------+
                       | VM_MIXEDMAP ?     |
                       +-------------------+
                          |        |
                        true     false
                          |        |
                          v        v
                       skip   NUMA balance VMA
                            (now includes hugetlb)

注意:作者在第二封邮件中撤回后,这条「新流程」并不被接受,社区应当继续按旧流程运行;下面的讨论按作者事后澄清的方向收敛。

关键实现

实际 diff 只改动了 task_numa_work() 内一个 if 条件中的一段表达式,删去 is_vm_hugetlb_page(vma) ||

@@ -4167,7 +4167,7 @@ static void task_numa_work(struct callback_head *work)
-       is_vm_hugetlb_page(vma) || (vma->vm_flags & VM_MIXEDMAP)) {
+       (vma->vm_flags & VM_MIXEDMAP)) {

逻辑上等价于:NUMA 工作线程扫描 VMA 时,不再把「是 hugetlb 页面」单独列为不可处理的额外理由。

Patch 概览

+-----------+--------------------+--------+--------------------+
| File      | Function           | Line ~ | Change             |
+-----------+--------------------+--------+--------------------+
| sched/    | task_numa_work     | 4167   | drop              |
| fair.c    |                    |        | is_vm_hugetlb_page |
|           |                    |        | from skip filter  |
+-----------+--------------------+--------+--------------------+

类比

task_numa_work() 的 VMA 扫描想成机场的一个登机口:金属探测门(vma_migratable(),会查 hugepage_migration_supported() 来判定 hugetlb 是否可迁移)、X 光机(vma_policy_mof(),看是否符合 NUMA 策略)都已经把好了关。但这里还额外安排了一位保安,职责只有一条:「看到大箱子(hugetlb)就挥手让人走」。

  • 作者原本的想法:金属探测门已经把关过了,这位保安是多余的,反而把本可以登机的「大箱子乘客」拦下,浪费了通道。
  • 现实情况(作者事后澄清):这条通道其实是机场的「手提行李快线」,规定上就禁止大箱子进入;这位保安不是冗余,而是规则的护栏,删掉就破坏了通道设计本身。

Highlight:风险与注意点

  1. 作者已主动撤回:第二封邮件明确写「Please ignore this patch. The code disables the hugetlb migration on purpose.」,维护者无需处理此 patch。
  2. vma_migratable()task_numa_work() 的语义不同vma_migratable() 的语义是「该 VMA 是否在『通用迁移』意义上可移动」,而 task_numa_work() 是 NUMA balancing 的入口,历史上刻意不让 hugetlb 进入自动 NUMA balancing,原因涉及大页迁移代价、配置 /proc/sys/numa_balancing 对 hugepage 的影响以及抖动控制;两者的「可迁移」并不等价。
  3. 单行条件删除 ≠ 简单 cleanup:调度器里很多 if (...) continue; 看似冗余,实则是显式策略表达;审查者要同时读被删条件、上层意图(NUMA balancing 策略)和被跳过的 trace(NUMAB_SKIP_UNSUITABLE)的语义。
  4. 真正的开放问题:这条线索留下的议题是「是否要让 hugetlb 进入自动 NUMA balancing」。如果要开启,需要单独评估 perf 收益、迁移成本和与 HUGEPAGE 迁移路径的协调,单独再开一个 patch series。
  5. 同作者、同日、自撤:这种「提交后几小时内自撤」的现象是上游常见节奏,说明作者在自测或思考后纠正了自己的判断;下游使用者无需为此调整任何代码。

版本变化

仅有 v1,且 v1 在提交当天由作者撤回,无 v2、无后续 rebase。

一句话总结

这是一条由 Huang Shijie 提交后又主动撤销的单行清理 patch:原本打算在 task_numa_work() 中删掉对 hugetlb 的额外过滤,但很快意识到保留 is_vm_hugetlb_page() 是有意禁止 hugetlb 进入 NUMA balancing 的策略,因此请社区忽略此 patch。