sched-ext discussion
[PATCH sched_ext/for-7.3] sched_ext: Make SCHED_CLASS_EXT select GENERIC_ALLOCATOR
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-ID:34c6e5eb01c406d93c8845b94a990069@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显式列出依赖或加 Kconfigselect。 - 本 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 解决稀疏配置下的链接失败。