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(默认 1)vm.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 结构完全对称。
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(默认 1)vm.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 结构完全对称。