sched discussion
[RFC PATCH 0/1] sysctl: remove CONFIG_SYSCTL, it just mirrors CONFIG_PROC_SYSCTL
LLM 分析
sysctl:移除冗余的 CONFIG_SYSCTL,只保留 CONFIG_PROC_SYSCTL
系列概况
- 标题:[RFC PATCH 0/1] sysctl: remove CONFIG_SYSCTL, it just mirrors CONFIG_PROC_SYSCTL
- 作者:Oleg Nesterov oleg@redhat.com
- 版本:RFC,单 patch(0/1 + 1/1),无版本号
- 规模:cover letter 自述 "touches 170 files";patch 展示了 arch、drivers、fs 各层
#ifdef的同步重命名 - 修改文件:arch/arm64/Kconfig、arch/arm64/kernel/fpsimd.c、arch/powerpc/kernel/idle.c、arch/powerpc/platforms/pseries/mobility.c、arch/riscv/kernel/vector.c、arch/x86/entry/vdso/vdso32-setup.c、arch/x86/kernel/cpu/transmeta.c、drivers/base/firmware_loader/fallback_table.c 与 sysfs.h、drivers/cdrom/cdrom.c、drivers/char/random.c、drivers/macintosh/Kconfig、drivers/net/vrf.c、drivers/parport/procfs.c、drivers/scsi/Makefile 与 scsi_priv.h、fs/Makefile、fs/aio.c、fs/cachefiles/Kconfig、fs/coda/Makefile 与 coda_int.h 等约 170 个
- 代码统计:纯
#ifdef CONFIG_SYSCTL->#ifdef CONFIG_PROC_SYSCTL的字符串重命名;少量 Kconfigdepends on同步替换;无新增逻辑、无运行时改动 - Message-ID:amC7F7oKFjYKcQW2@redhat.com(cover)、amC7Pm5I6CMh7KpD@redhat.com(patch)、amDArBvxjBRsmCvs@example.org(reply)
- 完整性:完整,cover、patch、回复各一封
注:本贴归在
sched频道,但讨论本身是sysctl子系统的清理,不涉及调度器功能改动。
补丁目的
消除 CONFIG_SYSCTL 与 CONFIG_PROC_SYSCTL 长期并存造成的语义重复。
历史背景是 61a47c1ad3a4 ("sysctl: Remove the sysctl system call") 删除了 sysctl 系统调用,设置 sysctl 的唯一通道只剩下 /proc/sys。两个 Kconfig 实际等价,但代码里两种写法散落各处,作者阅读时感到 "annoying / confusing"。
Oleg 把两条路线都摆出来求意见:
- 删
CONFIG_SYSCTL、保留CONFIG_PROC_SYSCTL—— 触 170 文件,语义清晰(本 RFC 的方向); - 删
CONFIG_PROC_SYSCTL、保留CONFIG_SYSCTL—— 改动小,但要去掉fs/proc/Kconfig里 user-visible 的 prompt。
同时征求 Andrew Morton / Eric 是否值得入 -mm 树。
旧流程的问题
阅读 #ifdef 时必须记住两套同义宏等价。代码理解成本上升,grep / cscope 命中率被一分为二;新代码还要选用哪个宏,带来无意义分叉。
新流程
把全部 CONFIG_SYSCTL 出现处替换为 CONFIG_PROC_SYSCTL(或反向),保留单一真值来源。
关键实现
只做宏名替换,不动运行时逻辑。
// arch/arm64/kernel/fpsimd.c
-#if defined(CONFIG_ARM64_SVE) && defined(CONFIG_SYSCTL)
+#if defined(CONFIG_ARM64_SVE) && defined(CONFIG_PROC_SYSCTL)
Kconfig depends on 同步:
// drivers/macintosh/Kconfig
- depends on SYSCTL && INPUT
+ depends on PROC_SYSCTL && INPUT
// fs/cachefiles/Kconfig
- depends on CACHEFILES && SYSCTL
+ depends on CACHEFILES && PROC_SYSCTL
Makefile 的 obj 条件也跟着改:
// drivers/scsi/Makefile
-scsi_mod-$(CONFIG_SYSCTL) += scsi_sysctl.o
+scsi_mod-$(CONFIG_PROC_SYSCTL) += scsi_sysctl.o
路径分布:arch(arm64、powerpc、riscv、x86) -> drivers(firmware_loader、cdrom、random、macintosh、vrf、parport、scsi) -> fs(aio、cachefiles、coda 等)一路平推。patch 因邮件截断只展示了前若干文件,后面 100+ 处同类替换以同一 perl 模式生成。
类比
这就像公司里"董事长"和"董事会主席"两个头衔在所有内部发文里同时出现,说的是同一个人。sysctl syscall 删除后那位"董事长"已经没有对应的法律实体,继续留着两个称呼只会让每次发文都要选一个,写信的人选错也不算错,但很别扭。RFC 就是建议"以后统称董事会主席",先探探大家意见再决定。
Highlight:风险与注意点
- 可观察行为差异:纯宏替换,理论上
.config兼容;但若老.config只设了CONFIG_SYSCTL=y,新代码要靠 Kconfigselect PROC_SYSCTL兜底,否则可能出现"旧 .config 编译通过但功能静默关闭"或编译失败。Oleg 在 cover 里未明确兜底策略,是首要 follow-up。 - 方向之争:删
CONFIG_SYSCTL触及 170 文件;删CONFIG_PROC_SYSCTL触及面更小,但要动fs/proc/Kconfig的 prompt。Andrew Morton 倾向小改动,但 prompt 是用户可见契约,两难。 - 遗漏点:patch 完全没碰
Documentation/、scripts/、tools/里可能的字符串引用;外部 kbuild 脚本、CI 模板若硬编码CONFIG_SYSCTL字符串,需要扫一遍。 - 与调度器接口的耦合:虽然不是 scheduler patch,但
kernel.sched_*、kernel.sched_util_clamp_*等 procfs 接口都依赖此宏可见。替换不会让它们消失(CONFIG_PROC_SYSCTL=y是默认),但要让文档 / kunit 测试继续覆盖。
ASCII 流程图
+-------------------+ +---------------------+
| BEFORE | | AFTER |
+-------------------+ +---------------------+
| Kconfig keeps | | Kconfig single |
| two equals | ====> | source of truth |
+-------------------+ +---------------------+
| CONFIG_SYSCTL | | CONFIG_PROC_SYSCTL |
| CONFIG_PROC_SYSCTL| | only |
+-------------------+ +---------------------+
| |
v v
+-------------------------+ +-------------------------+
| #ifdef CONFIG_SYSCTL | | #ifdef CONFIG_PROC_SYSCTL|
+-------------------------+ +-------------------------+
| arch/arm64 fpsimd.c | | arch/arm64 fpsimd.c |
| arch/powerpc idle.c | | arch/powerpc idle.c |
| arch/riscv vector.c | ---> | arch/riscv vector.c |
| drivers/scsi scsi_sysctl| | drivers/scsi scsi_sysctl|
| drivers/char/random.c | | drivers/char/random.c |
| fs/aio.c | | fs/aio.c |
| fs/cachefiles | | fs/cachefiles |
| ... ~170 files ... | | ... ~170 files ... |
+-------------------------+ +-------------------------+
| two truths, pick one | | one truth, uniform |
+-------------------------+ +-------------------------+
Patch 概览
单 patch(1/1),纯字符串重命名;不修改逻辑、不新增配置、不引入运行时副作用;由两条 perl one-liner 机械生成。
一句话总结
借 sysctl syscall 早已被移除的契机,把代码里"两个等价但分散"的 CONFIG_SYSCTL / CONFIG_PROC_SYSCTL 收成一个真值来源,先 RFC 探路、再决定删哪个方向。