0/6 已展开

LLM 分析

sysctl 清理:移除镜像开关 CONFIG_PROC_SYSCTL

系列概况

  • 标题:[PATCH -mm v2 0/1] sysctl: remove CONFIG_PROC_SYSCTL, it just mirrors CONFIG_SYSCTL
  • 作者:Oleg Nesterov oleg@redhat.com
  • 版本:v2,单 patch(1/1)
  • 规模:21 个文件,+32 / -36
  • 修改文件:arch/m68k/configs/{amcore,stmark2}_defconfigarch/s390/Kconfigarch/x86/kernel/cpu/bus_lock.cfs/proc/{Kconfig,Makefile,internal.h}include/linux/utsname.hinit/Kconfigkernel/delayacct.ckernel/sched/{core.c,topology.c}kernel/sysctl.ckernel/time/jiffies.ckernel/utsname_sysctl.clib/Kconfig.debuglib/test_sysctl.cnet/mpls/Kconfig,以及 tools/testing/selftests 下三个 config 文件
  • 代码统计:32 insertions(+),36 deletions(-)
  • Message-ID(首发):amdvVCcHUBNuRWjW@redhat.com
  • 完整性:cover letter + 1 patch + 4 封回复,完整线程

补丁目的

历史上有两个 Kconfig:CONFIG_SYSCTL(hidden bool)和 CONFIG_PROC_SYSCTL(带 prompt 的用户可见项)。在 commit 61a47c1ad3a4("sysctl: Remove the sysctl system call")之后,CONFIG_SYSCTL 的唯一选择器就是 CONFIG_PROC_SYSCTL,两者永远相等。

继续保留两个名字会让代码里反复出现 #ifdef CONFIG_PROC_SYSCTL#ifdef CONFIG_SYSCTL 并列,让读者必须先记住"两者语义相同"才能阅读;fs/proc/Kconfig 里还要 select SYSCTL,构成"两个开关表达同一个意思"的反模式。本 patch 把 PROC_SYSCTL 这个 prompt 重命名/合并为 SYSCTL,并全树 s/CONFIG_PROC_SYSCTL/CONFIG_SYSCTL/

旧流程的问题

  • 同一份 sysctl 表在不同文件里同时出现 CONFIG_PROC_SYSCTLCONFIG_SYSCTL 嵌套(典型如 kernel/sysctl.ckernel/sched/core.c);
  • fs/proc/KconfigPROC_SYSCTL 还需 select SYSCTL,是典型的"两个开关表达同一含义";
  • 用户可见 prompt 改名(PROC_SYSCTL -> SYSCTL)对 out-of-tree 配置、bisect、用户脚本不友好。

新流程

  • fs/proc/Kconfig:把 PROC_SYSCTL 改名为 SYSCTL,仍 depends on PROC_FS,仍 default y,不再 select SYSCTL
  • init/Kconfig:移除已退化为 hidden bool 的 CONFIG_SYSCTL
  • 全树替换 CONFIG_PROC_SYSCTL -> CONFIG_SYSCTL
  • 作者预告后续 followup:
    • kernel/sysctl.c:折叠现在已完全相同的 CONFIG_SYSCTL 嵌套;
    • drivers/parport/procfs.cfs/dcache.cfs/file_table.c:去掉多余的 CONFIG_PROC_FS 检查(因为 CONFIG_SYSCTL 已隐含依赖 PROC_FS)。

Patch 概览

  • fs/proc/Kconfig:合并命名
  • init/Kconfig:删除 hidden bool
  • kernel/sched/core.c:4 处替换,覆盖 sysctl_numa_balancingsetup_schedstatssysctl_schedstats
  • kernel/sched/topology.c:2 处替换,覆盖 rebuild_sched_domains_energysched_energy_aware_sysctl_init
  • 其余文件按需替换

关键实现

核心只在 Kconfig 层:把"PROC_SYSCTL 选中 SYSCTL"反过来理解为"SYSCTL 自己就是 PROC_SYSCTL"。

/* fs/proc/Kconfig -- before */
config PROC_SYSCTL
    bool "Sysctl support (/proc/sys)" if EXPERT
    depends on PROC_FS
    select SYSCTL
    default y

/* fs/proc/Kconfig -- after */
config SYSCTL
    bool "Sysctl support (/proc/sys)" if EXPERT
    depends on PROC_FS
    default y

scheduler 内的两处示例:

/* kernel/sched/core.c */
-#ifdef CONFIG_PROC_SYSCTL
+#ifdef CONFIG_SYSCTL
...
 static int sysctl_numa_balancing(const struct ctl_table *table, int write,
-#endif /* CONFIG_PROC_SYSCTL */
+#endif /* CONFIG_SYSCTL */

依赖关系图:

+--------------------+        +----------------------+
|      PROC_FS       |------->|    CONFIG_SYSCTL     |
+--------------------+ |  (= old PROC_SYSCTL) |
 |  prompt: "Sysctl |
                             |   support (/proc/sys)"|
                             +----------+-----------+
 |
        +-------------------------------+-------------------------------+
        |                               |                               |
        v                               v                               v
+----------------------+ +-----------------------+ +----------------------+
| kernel/sched/core.c  |    | kernel/sched/         |      | kernel/sysctl.c      |
| - sysctl_numa_       |    |   topology.c          |      | - proc_do_large_     |
|   balancing          |    | - rebuild_sched_      |      |   bitmap             |
| - sysctl_schedstats  |    |   domains_energy |      | - proc_do_static_key |
| - setup_schedstats |    | - sched_energy_aware_ |      |                      |
|                      |    |   sysctl_init         |      |                      |
+----------------------+    +-----------------------+      +----------------------+

全树替换前后对比:

+32 / -36 lines
   21 files
   -- fs/proc/Kconfig        (rename + drop select)
   -- init/Kconfig           (drop hidden bool)
   -- kernel/sched/*         (6 occurrences of #ifdef)
   -- kernel/sysctl.c        (10+ occurrences of #ifdef / #else)
   -- other arch + toolchain (follow the rename)

讨论中关注点的层次图:

 Reviewer concerns
                       ---------------- |
        +-----------------+------------------+
        |                                    |
 rename impact review base (Nicolas: (Andrew:
 bisect, oot, Sashiko uses user scripts)                       net/HEAD, not
        |                               linux-next)
        v                                    v
   "rename is bad"                   false-positive on
   (docs URL)                        missed instance |                                    |
 +-----------------+------------------+
                          v Oleg responds |
 +-------------+-------------+
            | |             |
       both concerns prior [RFC PATCH]  followup
       acknowledged   killed hidden     cleanups
                      SYSCTL instead pending

类比

原本家里有两个开关控制同一盏灯:一个藏在墙里(CONFIG_SYSCTL),一个贴在外面(CONFIG_PROC_SYSCTL),墙里那个还得"select"一下外面的才亮。补丁把墙里那个拆掉,只留外面那个灯控,并把外壳标签从"PROC_SYSCTL"换成"SYSCTL"——房间的逻辑没变,但少了一个冗余开关和"两个名字一个含义"的迷惑。Scheduler 里的几处 sysctl 接口就好比客厅/厨房墙上贴的灯控面板,本贴只换标签、不动布线。

Highlight:风险与注意点

  • 用户可见 Kconfig 改名PROC_SYSCTL -> SYSCTL 会破坏依赖此名的 out-of-tree 配置与脚本,并影响 bisect(Nicolas 已指出);
  • 依赖关系硬约束:patch 显式依赖 -mm 中的 sysctl-move-the-cad_pid-entry-from-pid_table-to-kern_reboot_table.patch,后者已删掉 kernel/pid.c 的一处 #ifdef,必须先合入,否则 Sashiko 类自动测试会误报"漏改";
  • review 工具 base:Andrew 提示 Sashiko 选用了 net/HEAD 而非 linux-next,建议改为基于 linux-next 再跑;
  • followup 风险:预告的 kernel/sysctl.c 嵌套折叠以及 parport/dcache/file_table 中 CONFIG_PROC_FS 检查清理尚未合入,可能与本 patch 形成"分两次破坏 ABI"的连锁;
  • init/Kconfig 删除 hidden bool:理论上任何仍引用 CONFIG_SYSCTL 但未跟随本 patch 重命名的代码会立即破坏编译,需确认 grep 全树无遗漏。

版本变化

v1 -> v2:标题与提交内容一致;v2 的 cover 显式声明基于 -mm 中的 cad_pid patch,并预告了若干 followup 清理(kernel/sysctl.c 嵌套折叠、CONFIG_PROC_FS 检查删除)。

一句话总结

把与 CONFIG_SYSCTL 镜像的 CONFIG_PROC_SYSCTL 合二为一,全树替换 6 处 scheduler 内 #ifdef,属于安全的 Kconfig 收敛清理;但需注意用户可见 prompt 改名对 out-of-tree 用户与 bisect 的潜在影响。