page_alloc __offline_isolated_pages

发布时间:2026/10/21 2:31:07
page_alloc __offline_isolated_pages __offline_isolated_pages是内存热移除流程中的核心函数用于在页面已被成功隔离的前提下将它们从伙伴系统中彻底移除并标记对应的内存段为离线状态。核心实现unsigned long __offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn) { unsigned long already_offline 0, flags; unsigned long pfn start_pfn; struct page *page; struct zone *zone; unsigned int order; offline_mem_sections(pfn, end_pfn); zone page_zone(pfn_to_page(pfn)); spin_lock_irqsave(zone-lock, flags); while (pfn end_pfn) { page pfn_to_page(pfn); /* * The HWPoisoned page may be not in buddy system, and * page_count() is not 0. */ if (unlikely(!PageBuddy(page) PageHWPoison(page))) { pfn; continue; } /* * At this point all remaining PageOffline() pages have a * reference count of 0 and can simply be skipped. */ if (PageOffline(page)) { BUG_ON(page_count(page)); BUG_ON(PageBuddy(page)); already_offline; pfn; continue; } BUG_ON(!PageBuddy(page)); VM_WARN_ON(get_pageblock_migratetype(page) ! MIGRATE_ISOLATE); order buddy_order(page); del_page_from_free_list(page, zone, order, MIGRATE_ISOLATE); pfn (1 order); } spin_unlock_irqrestore(zone-lock, flags); return end_pfn - start_pfn - already_offline; }关键处理逻辑1. 跳过硬件毒化页if (unlikely(!PageBuddy(page) PageHWPoison(page))) { pfn; continue; }硬件毒化页HWPoison可能不在伙伴系统中且引用计数不为 0无法通过常规方式移除因此逐页跳过。2. 跳过已离线页if (PageOffline(page)) { BUG_ON(page_count(page)); BUG_ON(PageBuddy(page)); already_offline; pfn; continue; }PageOffline页已被标记为离线引用计数为 0不在伙伴系统中直接跳过并计数。3. 从伙伴系统摘除空闲页BUG_ON(!PageBuddy(page)); VM_WARN_ON(get_pageblock_migratetype(page) ! MIGRATE_ISOLATE); order buddy_order(page); del_page_from_free_list(page, zone, order, MIGRATE_ISOLATE); pfn (1 order);断言页面确实是 Buddy 状态否则说明隔离不彻底。调试模式下警告迁移类型必须为MIGRATE_ISOLATE。用buddy_order(page)获取页块阶数然后整体从空闲链表中摘除。4. 返回值return end_pfn - start_pfn - already_offline;返回实际移除的“被管理页”数量供调用方adjust_managed_page_count()更新 zone 统计。关键约束必须跨完整 section注释要求范围必须 span full sections。必须先隔离调用前必须通过start_isolate_page_range()将 pageblock 标记为MIGRATE_ISOLATE。必须在zone-lock下操作摘除空闲链表需要持有 zone 锁。与调用方的关系在offline_pages()流程中__offline_isolated_pages()在test_pages_isolated()确认全部隔离成功后调用。它移除页后调用方会修正zone-nr_isolate_pageblock计数。调用zone_pcp_enable(zone)恢复 PCP 缓存。用adjust_managed_page_count()更新统计。清空节点状态并重建 zonelist。2026 年的重构2026 年的补丁将其中的显式spin_lock_irqsave/spin_unlock_irqrestore替换为guard(spinlock_irqsave)作用域锁简化了错误路径的锁管理。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询