ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

page_alloc __free_pages_ok

page_alloc __free_pages_ok __free_pages_ok()是伙伴系统释放路径的核心执行入口负责在页面通过校验后将其实际归还给伙伴系统。核心职责它的主要工作是完成释放前的最后准备并调用free_one_page()执行实际归还。从代码演进来看它的结构在 2023 年被简化将锁操作和迁移类型校验委托给了free_one_page()。关键逻辑1. 迁移类型获取在获取 zone 锁之前先从 pageblock 读取迁移类型。这是一个乐观读取后续在free_one_page()持锁后会重新校验以处理隔离isolate竞态。2. 调用核心释放函数将工作委托给free_one_page()由后者负责加锁、迁移类型校验以及调用__free_one_page()。3. 更新 VM 事件统计释放成功后调用__count_vm_events(PGFREE, 1 order)更新全局的页面释放事件计数。在释放路径中的位置它是free_pages_prepare()校验通过后的直接下游__free_pages_ok(page, order, fpi_flags) ├── migratetype get_pfnblock_migratetype(page, pfn) // 乐观读取 ├── free_one_page(zone, page, pfn, order, migratetype, fpi_flags) │ ├── spin_lock_irqsave(zone-lock, flags) │ ├── 迁移类型重校验处理隔离竞态 │ └── __free_one_page(...) // 实际合并与归还 └── __count_vm_events(PGFREE, 1 order)关键演进2023 年的简化补丁commit250ae189移除了__free_pages_ok()中直接操作zone-lock的冗余代码改为直接调用free_one_page()使释放路径的锁与校验逻辑更加集中。总结__free_pages_ok()是释放路径的执行层它读取迁移类型、委托free_one_page()完成加锁与归还、更新 VM 统计。它的存在确保了释放操作在正确的锁保护下将页块交还给伙伴系统。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进