0/3 已展开

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 的字符串重命名;少量 Kconfig depends on 同步替换;无新增逻辑、无运行时改动
  • Message-IDamC7F7oKFjYKcQW2@redhat.com(cover)、amC7Pm5I6CMh7KpD@redhat.com(patch)、amDArBvxjBRsmCvs@example.org(reply)
  • 完整性:完整,cover、patch、回复各一封

注:本贴归在 sched 频道,但讨论本身是 sysctl 子系统的清理,不涉及调度器功能改动。

补丁目的

消除 CONFIG_SYSCTLCONFIG_PROC_SYSCTL 长期并存造成的语义重复。

历史背景是 61a47c1ad3a4 ("sysctl: Remove the sysctl system call") 删除了 sysctl 系统调用,设置 sysctl 的唯一通道只剩下 /proc/sys。两个 Kconfig 实际等价,但代码里两种写法散落各处,作者阅读时感到 "annoying / confusing"。

Oleg 把两条路线都摆出来求意见:

  1. CONFIG_SYSCTL、保留 CONFIG_PROC_SYSCTL —— 触 170 文件,语义清晰(本 RFC 的方向);
  2. 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:风险与注意点

  1. 可观察行为差异:纯宏替换,理论上 .config 兼容;但若老 .config 只设了 CONFIG_SYSCTL=y,新代码要靠 Kconfig select PROC_SYSCTL 兜底,否则可能出现"旧 .config 编译通过但功能静默关闭"或编译失败。Oleg 在 cover 里未明确兜底策略,是首要 follow-up。
  2. 方向之争:删 CONFIG_SYSCTL 触及 170 文件;删 CONFIG_PROC_SYSCTL 触及面更小,但要动 fs/proc/Kconfig 的 prompt。Andrew Morton 倾向小改动,但 prompt 是用户可见契约,两难。
  3. 遗漏点:patch 完全没碰 Documentation/scripts/tools/ 里可能的字符串引用;外部 kbuild 脚本、CI 模板若硬编码 CONFIG_SYSCTL 字符串,需要扫一遍。
  4. 与调度器接口的耦合:虽然不是 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 探路、再决定删哪个方向。