0/3 已展开

LLM 分析

sched_ext:修复 SCHED_CLASS_EXT 缺失 GENERIC_ALLOCATOR 依赖导致的链接失败

系列概况

  • 标题:[PATCH sched_ext/for-7.3] sched_ext: Make SCHED_CLASS_EXT select GENERIC_ALLOCATOR
  • 作者:Tejun Heo tj@kernel.org
  • 目标分支:sched_ext/for-7.3
  • 版本规模:v1,单 patch,1 文件 / +1 行
  • 修改文件kernel/Kconfig.preempt
  • 代码统计:1 行新增(select GENERIC_ALLOCATOR
  • Message-ID34c6e5eb01c406d93c8845b94a990069@kernel.org
  • 完整性:完整 — 包含 commit message、Fixes tag、Reported-by、Signed-off-by 与 hunk,并附带 maintainer apply 回复和 reviewer 的 Reviewed-by。

补丁目的

kernel/sched/ext/arena.c 使用了 gen_pool_* 接口(gen_pool_create / gen_pool_for_each_chunk / gen_pool_destroy)。这些符号来自 lib/genalloc.c,由 GENERIC_ALLOCATOR 配置项控制编译。

问题:SCHED_CLASS_EXT 这个 Kconfig 项没有 select GENERIC_ALLOCATOR,因此当用户只启用 SCHED_CLASS_EXT、且没有任何其他依赖选中 GENERIC_ALLOCATOR 时,链接器会找不到 gen_pool_create 等符号:

build_policy.o: undefined reference to `gen_pool_create'
build_policy.o: undefined reference to `gen_pool_for_each_chunk'
build_policy.o: undefined reference to `gen_pool_destroy'

本 patch 通过 select GENERIC_ALLOCATOR 把这一隐式依赖显式补齐,避免稀疏配置出现链接失败。

旧流程的问题

旧 Kconfig 配置:

config SCHED_CLASS_EXT
    bool "Extensible Scheduling Class"
    depends on BPF_SYSCALL && BPF_JIT && DEBUG_INFO_BTF
    select STACKTRACE if STACKTRACE_SUPPORT

启用 SCHED_CLASS_EXT 后,kernel/sched/ext/arena.c 引用 gen_pool_*,但 GENERIC_ALLOCATOR 默认不被选中,结果产生 undefined reference 链接错误(由 0day/lkp 机器人捕获)。

新流程

config SCHED_CLASS_EXT
    bool "Extensible Scheduling Class"
    depends on BPF_SYSCALL && BPF_JIT && DEBUG_INFO_BTF
    select GENERIC_ALLOCATOR        <-- 新增
    select STACKTRACE if STACKTRACE_SUPPORT

任何打开 SCHED_CLASS_EXT 的配置都会自动带上 GENERIC_ALLOCATOR,genalloc.c 一并被编译,链接错误消失。

关键实现

整个改动只有一行:

config SCHED_CLASS_EXT
    bool "Extensible Scheduling Class"
    depends on BPF_SYSCALL && BPF_JIT && DEBUG_INFO_BTF
+   select GENERIC_ALLOCATOR
    select STACKTRACE if STACKTRACE_SUPPORT
    help
      This option enables a new scheduler class sched_ext (SCX), ...

select 的语义是“只要选中此选项,就强制打开所选选项”,是处理 Kconfig 中隐式硬依赖(代码层面调用了某符号但不便 depends on)的标准做法。

ASCII 流程图

          旧流程(已坏)
   ============================
   用户: CONFIG_SCHED_CLASS_EXT=y
                |
                v
   Kconfig: 不含 GENERIC_ALLOCATOR
                |
                v
   build_policy.o 引用 gen_pool_create
                |
                v
   lib/genalloc.c 未编译
                |
                v
   ====== ld 报错: undefined reference ======


          新流程(已修)
   ============================
   用户: CONFIG_SCHED_CLASS_EXT=y
                |
                v
   Kconfig: select GENERIC_ALLOCATOR  <-- 本 patch
                |
                v
   lib/genalloc.c 一并编入 vmlinux
                |
                v
   build_policy.o 链接 OK
                |
                v
   链接器走出 sched_ext/for-7.3 编译失败

类比

把 Kconfig 想成一份餐厅点菜单:SCHED_CLASS_EXT 是一道菜,里面需要用到“食材 R”(genalloc)。但菜单上写的是“凡点这道菜的客人请自动附赠食材 R”——select 就是这种“自动附赠”声明。

修复前的情况是:服务员忘了勾这份附赠声明,厨房虽然做了主菜,但调酱料时发现 R 缺货,整桌菜只能打回。修复后,服务员把附赠声明写进菜单,无论谁单点这道菜,R 都会被自动勾上,厨房再也不会缺料。

Highlight:风险与注意点

  • select 会强制拉入被选项,可能让最小化配置(allnoconfig / tinyconfig)偏肥;这里 GENERIC_ALLOCATOR 体积可控,且确实被 arena.c 引用,是合理的 select。
  • 后续若 arena.c 引入更多不通过 select/依赖声明覆盖到的库函数,类似链接错误还会再次出现——建议新增代码时先在 kernel/sched/ext/Makefile 显式列出依赖或加 Kconfig select
  • 本 patch 没有改动运行时路径,纯构建期修复,已被 Tejun Heo 立刻合入 sched_ext/for-7.3,并由 Bradley Morgan 给出 Reviewed-by

一句话总结

SCHED_CLASS_EXT 调用了 gen_pool_* 却未 select GENERIC_ALLOCATOR,补丁通过在 kernel/Kconfig.preempt 加一行 select GENERIC_ALLOCATOR 解决稀疏配置下的链接失败。