内存管理-70-page_pinner-1-理论
基于 kernel-6.1
一、简介
CONFIG_PAGE_PINNER:回答“这页为什么迁不走,可能被谁长期持有”。目标是排查"页迁移失败/alloc_contig 失败时,谁在持有该页"。配置项定义在 Kconfig.debug,实现在 page_pinner.c。
config PAGE_PINNER bool "Track page pinner" depends on DEBUG_KERNEL && STACKTRACE_SUPPORT select DEBUG_FS select STACKTRACE select STACKDEPOT select PAGE_EXTENSION help 此功能用于跟踪页面的调用链,有助于查找页面迁移失败的原因。即使您在构建中包含此功能, 它默认也是禁用的。您需要将"page_pinner=on"传递给启动参数才能启用它。启用后 会占用相当多的内存。
(1) 它记录什么
a. 失败检测时的调用栈;
b. 页状态快照:pfn、count、mapcount、mapping、flags;
c. 时间信息(失败时刻、从失败到 put 的持续时间);
相关结构见 page_pinner.c 中的 struct page_pinner。
(2) 触发时机(很关键)
a. 页隔离失败时标记:见 page_isolation.c: test_pages_isolated() --> page_pinner_failure_detect(pfn)
b. alloc_contig 迁移失败(-EBUSY)时标记:见 page_alloc.c: __alloc_contig_migrate_range() --> page_pinner_failure_detect(page);
c. put_page 路径会回填“持有时长”记录:见 mm.h: put_page_testzero() --> page_pinner_put_page(page);
d. 页面最终 free 时清理状态:见 page_alloc.c: free_pages_prepare() --> free_page_pinner(page, order);
(3) 启用与输出
编译 CONFIG_PAGE_PINNER, 启动参数 page_pinner=on(默认关闭),见 page_pinner.c: early_param("page_pinner", early_page_pinner_param);
提供 debugfs 有:
/sys/kernel/debug/page_pinner/buffer /sys/kernel/debug/page_pinner/failure_tracking /sys/kernel/debug/page_pinner/buffer_size
创建位置见 page_pinner_init()。
(4) 开销特征
同样依赖 PAGE_EXTENSION/STACKDEPOT/STACKTRACE,见 Kconfig.debug。更偏"问题触发时采样记录",用于迁移失败现场,不是常规性能功能
posted on 2026-07-09 16:32 Hello-World3 阅读(3) 评论(0) 收藏 举报
浙公网安备 33010602011771号