☰
page_alloc alloc_contig_dump_pages
2026/10/20 2:23:25 网站建设 项目流程

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。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询