page_alloc __parse_numa_zonelist_order
发布时间:2026/10/14 10:36:24 锦皓数字建站

__parse_numa_zonelist_order()是内核中用于解析用户指定的 zonelist 排序策略的辅助函数。它把用户传入的字符串如node、zone、default转换成对应的内部常量供build_zonelists()决定如何排列 NUMA 节点的 zone 分配顺序。核心作用解析三种排序策略zonelist 决定了分配内存时 zone 的尝试顺序有两种基本策略Node order节点序先按节点远近排节点内再按 zone 类型排。好处是局部性最好本地 Normal 内存耗尽后才会溢出到本地 DMA但有耗尽 DMA 的风险。Zone orderZone 序先按 zone 类型排高 zone 优先同类型 zone 内再按节点远近排。好处是保护 DMA/DMA32 不被轻易耗尽但可能导致本地 Normal 还有内存时就去远程节点分配。可以通过内核启动参数numa_zonelist_order或 sysctl 来指定策略。函数实现static int __parse_numa_zonelist_order(char *s) { if (*s d || *s D) { user_zonelist_order ZONELIST_ORDER_DEFAULT; } else if (*s n || *s N) { user_zonelist_order ZONELIST_ORDER_NODE; } else if (*s z || *s Z) { user_zonelist_order ZONELIST_ORDER_ZONE; } else { printk(KERN_WARNING Ignoring invalid numa_zonelist_order value: %s\n, s); return -EINVAL; } return 0; }逻辑解析大小写不敏感通过*s d || *s D等方式接受首字母的大小写形式。三种有效值d/D→ZONELIST_ORDER_DEFAULT0自动检测由default_zonelist_order()根据系统配置决定。n/N→ZONELIST_ORDER_NODE1按节点局部性排序。z/Z→ZONELIST_ORDER_ZONE2按 zone 类型排序。无效值处理打印警告并返回-EINVAL调用方据此回滚用户设置。配套的调用链启动参数解析static __init int setup_numa_zonelist_order(char *s) { if (s) return __parse_numa_zonelist_order(s); return 0; } early_param(numa_zonelist_order, setup_numa_zonelist_order);通过early_param注册内核启动时解析numa_zonelist_order参数。sysctl 处理int numa_zonelist_order_handler(...) { ... if (__parse_numa_zonelist_order((char*)table-data)) { /* 无效值恢复保存的字符串 */ strncpy((char*)table-data, saved_string, ...); user_zonelist_order oldval; } else if (oldval ! user_zonelist_order) build_all_zonelists(); /* 策略变化重建 zonelist */ ... }sysctl 写入时也会调用它解析若有效且值有变化则触发build_all_zonelists()重建所有节点的 zonelist。总结__parse_numa_zonelist_order()是 zonelist 排序策略的字符串解析器它把default/node/zone转换成ZONELIST_ORDER_*常量存入user_zonelist_order供后续set_zonelist_order()和build_zonelists()使用。它同时服务于启动参数和 sysctl 两条配置路径是用户控制 NUMA 内存分配顺序的入口。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。