首页 / 资讯中心 / 文章详情

page_alloc alloc_contig_dump_pages

page_alloc alloc_contig_dump_pages ★ FEATURED ARTICLE
alloc_contig_dump_pages()是alloc_contig_range()在迁移失败时用于输出诊断信息的调试辅助函数。它通过 dynamic debug 机制控制默认关闭仅在调试 CMA 分配失败时启用。核心作用与设计背景在alloc_contig_range()分配连续内存常用于 CMA时如果页面迁移失败函数会返回-EBUSY。但仅凭-EBUSY无法知道是哪些页阻碍了迁移——可能是长期 pinned 的页、ZONE_MOVABLE 上的不可迁移页或其他异常状态页。alloc_contig_dump_pages()就是为此设计的它遍历迁移失败的页链表对每个页调用dump_page()输出详细信息帮助开发者定位失败原因。实现与调试机制根据相关补丁该函数大致实现如下static void alloc_contig_dump_pages(struct list_head *page_list) { struct page *page; list_for_each_entry(page, page_list, lru) dump_page(page, migration failure); }调用点位于alloc_contig_range()的迁移失败路径中if (ret ret ! -EBUSY) { ... } /* 迁移失败时若调试启用则输出失败页 */ alloc_contig_dump_pages(cc.migratepages);启用方式由于该函数使用 dynamic debug 基础设施默认不输出任何信息避免在频繁调用alloc_contig_range()时刷屏。管理员可以按需启用# 启用 dump在 /sys/kernel/debug/dynamic_debug/control 中操作 echo func alloc_contig_dump_pages p control # 禁用 echo func alloc_contig_dump_pages _ control条件编译支持两种模式CONFIG_DYNAMIC_DEBUG_CORE DYNAMIC_DEBUG_MODULE仅对特定文件启用CONFIG_DYNAMIC_DEBUG系统全局启用与alloc_contig_range的关系alloc_contig_dump_pages()是alloc_contig_range()的调试附属功能。后者在隔离 pageblock、迁移页、从伙伴系统移除页的完整流程中如果__alloc_contig_migrate_range()返回-EBUSY就会调用这个 dump 函数输出失败页信息。其价值在于dump_page()的输出已被证明对调试内存分配问题很有帮助例如识别 ZONE_MOVABLE 或 MIGRATE_CMA 上的长期 pinning。
阅读完成 · 觉得有帮助?
咨询建站