内存管理-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)    收藏  举报

导航