page_alloc sysctl_min_slab_ratio_sysctl_handler sysctl_min_slab_ratio_sysctl_handler()是/proc/sys/vm/min_slab_ratio的 sysctl 处理函数负责响应用户对该参数的读写请求并在写入后重新计算各 NUMA 节点的min_slab_pages阈值。核心实现static int sysctl_min_slab_ratio_sysctl_handler(const struct ctl_table *table, int write, void *buffer, size_t *length, loff_t *ppos) { int rc; rc proc_dointvec_minmax(table, write, buffer, length, ppos); if (rc) return rc; if (write) setup_min_slab_ratio(); return 0; }1. 标准整数读写与范围检查rc proc_dointvec_minmax(table, write, buffer, length, ppos); if (rc) return rc;proc_dointvec_minmax()标准 sysctl 整数处理把用户输入的字符串解析为整数写入table-data即sysctl_min_slab_ratio或把当前值读出。带_minmax后缀表示写入时检查值是否在table-extra1和table-extra2范围内通常是[0, 100]因为它是百分比。2. 写操作后重新计算阈值if (write) setup_min_slab_ratio();调用前面讲过的setup_min_slab_ratio()遍历所有在线节点和 zone重新累加pgdat-min_slab_pages。sysctl_min_slab_ratio变了所有节点的 slab 回收门槛都要重新算。注意现代内核中setup_min_slab_ratio()是无参数的pgdat 级计算而在早期版本中它接收zone参数并在循环中调用。3. 读操作如果write 0只执行proc_dointvec_minmax()把当前值复制给用户不做额外处理。sysctl 表定义{ .procname min_slab_ratio, .data sysctl_min_slab_ratio, .maxlen sizeof(sysctl_min_slab_ratio), .mode 0644, .proc_handler sysctl_min_slab_ratio_sysctl_handler, .extra1 SYSCTL_ZERO, .extra2 one_hundred, },最小 0最大 100百分比默认值为 5。与sysctl_min_unmapped_ratio_sysctl_handler()的对称性方面sysctl_min_unmapped_ratio_sysctl_handler()sysctl_min_slab_ratio_sysctl_handler()控制的参数vm.min_unmapped_ratio默认 1vm.min_slab_ratio默认 5写后调用setup_min_unmapped_ratio()setup_min_slab_ratio()计算目标pgdat-min_unmapped_pagespgdat-min_slab_pages语义文件页回收门槛slab 回收门槛两者的 handler 结构完全对称只是调用的计算函数不同。历史演进2022 年Miaohe Lin在should_continue_reclaim()中引入min_slab_pages参与 NUMA 节点回收的触发判断。2025-2026 年有 RFC 补丁提议移除min_slab_ratio机制认为其价值有限可能被更通用的回收策略取代。如果该提案合并这个 handler 也会被一并移除。总结sysctl_min_slab_ratio_sysctl_handler()是vm.min_slab_ratio的sysctl 读写入口它通过proc_dointvec_minmax()完成标准的整数读写和范围检查0~100写操作后调用setup_min_slab_ratio()重新计算所有 NUMA 节点的min_slab_pages阈值。这个阈值控制着zone_reclaim是否值得触发 slab 缓存回收与min_unmapped_ratio的 handler 结构完全对称。