sched discussion
[PATCH -mm v2 0/1] sysctl: remove CONFIG_PROC_SYSCTL, it just mirrors CONFIG_SYSCTL
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}_defconfig、arch/s390/Kconfig、arch/x86/kernel/cpu/bus_lock.c、fs/proc/{Kconfig,Makefile,internal.h}、include/linux/utsname.h、init/Kconfig、kernel/delayacct.c、kernel/sched/{core.c,topology.c}、kernel/sysctl.c、kernel/time/jiffies.c、kernel/utsname_sysctl.c、lib/Kconfig.debug、lib/test_sysctl.c、net/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_SYSCTL与CONFIG_SYSCTL嵌套(典型如kernel/sysctl.c、kernel/sched/core.c); fs/proc/Kconfig:PROC_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.c、fs/dcache.c、fs/file_table.c:去掉多余的CONFIG_PROC_FS检查(因为CONFIG_SYSCTL已隐含依赖 PROC_FS)。
Patch 概览
fs/proc/Kconfig:合并命名init/Kconfig:删除 hidden boolkernel/sched/core.c:4 处替换,覆盖sysctl_numa_balancing、setup_schedstats、sysctl_schedstatskernel/sched/topology.c:2 处替换,覆盖rebuild_sched_domains_energy、sched_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 的潜在影响。