资讯动态

page_alloc split_large_buddy

发布时间:2026/10/9 2:53:12 来源:尧图企业网站定制
是伙伴系统中用于将超大页块拆分成单个 pageblock并分别释放的辅助函数。核心作用伙伴系统buddy allocator本身只支持到MAX_PAGE_ORDER通常为 10即 4MB。但alloc_contig_range()等接口可能分配出大于MAX_PAGE_ORDER的连续内存例如 gigantic hugetlb folio。当这些超大页块被释放时无法直接通过__free_one_page()归还伙伴系统必须先在split_large_buddy()中按 pageblock 为单位拆分再逐块释放。参数解析参数含义zone目标 zonepage页块首页pfn页块起始 pfnorder页块阶数fpi释放内部标志FPI_TO_TAIL等核心逻辑static void split_large_buddy(struct zone *zone, struct page *page, unsigned long pfn, int order, fpi_t fpi) { unsigned long end pfn (1 order); VM_WARN_ON_ONCE(!IS_ALIGNED(pfn, 1 order)); /* Caller removed page from freelist, buddy info cleared! */ VM_WARN_ON_ONCE(PageBuddy(page)); if (order pageblock_order) order pageblock_order; while (pfn ! end) { int mt get_pfnblock_migratetype(page, pfn); __free_one_page(page, pfn, zone, order, mt, fpi); pfn 1 order; page pfn_to_page(pfn); } }步骤说明阶数钳制将释放阶数限制到pageblock_order因为 pageblock 是迁移类型管理的基本单位按 pageblock 释放才能保证每块归入正确的空闲链表-6。逐 pageblock 释放循环处理每个 pageblock用get_pfnblock_migratetype()读取该 pageblock 的迁移类型调用__free_one_page()将其归还伙伴系统推进pfn和page指针。PG_zeroed 标志传播在较新的补丁中若原始页块带有PG_zeroed标志需要在每个子页释放前重新设置因为__free_pages_prepare()会清除所有标志。调用场景它主要在以下路径中被调用free_one_page()当释放的页块阶数大于MAX_PAGE_ORDER时必须先拆分。move_freepages_block_isolate()在内存隔离路径中需要改变 pageblock 迁移类型时。内存热插拔 / 内存上线释放大于 pageblock_order 的连续块时。性能优化后续补丁对split_large_buddy()的使用做了条件化处理对于order pageblock_order的常见情况或所有 pageblock 迁移类型相同的情况不需要拆分直接调用__free_one_page()即可避免无意义的先拆再合。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑