page_alloc add_to_free_list

发布时间:2026/10/22 2:17:24
page_alloc add_to_free_list add_to_free_list()是__add_to_free_list()的带统计更新的封装版本用于将一个空闲页块加入伙伴系统的空闲链表并同步更新free_area的nr_free计数。核心作用与与__add_to_free_list()的区别函数操作nr_free计数__add_to_free_list()仅list_add/list_add_tail调用方负责add_to_free_list()__add_to_free_list() 计数更新自动递增双下划线前缀__表示“纯物理操作”而add_to_free_list()是完整封装——加入链表的同时把zone-free_area[order].nr_free加 1。典型实现static inline void add_to_free_list(struct page *page, struct zone *zone, unsigned int order, int migratetype, bool tail) { __add_to_free_list(page, zone, order, migratetype, tail); zone-free_area[order].nr_free; }参数解析参数含义page页块首页zone目标 zoneorder阶数决定free_area[order]migratetype迁移类型决定free_list[migratetype]tailtrue尾插延迟复用false头插优先复用在释放路径中的位置__free_one_page()在合并完成后、未被 compaction 捕获时会调用它把页块加入空闲链表if (capc !compaction_capture(capc, page, order, migratetype)) { set_buddy_order(page, order); add_to_free_list(page, zone, order, migratetype, to_tail); }迁移类型变更时的nr_free处理一个容易忽略的细节当页块从一种迁移类型移到另一种时如 fallback 偷页、CMA 借用不能简单地用add_to_free_list()因为那样会重复增加总数。move_to_free_list()的操作是“先删后加”__del_page_from_free_list()会减少旧链表的nr_free再用__add_to_free_list()而非add_to_free_list()加回新链表。如果这里误用add_to_free_list()就会导致该页块的计数被错误地增加。总结add_to_free_list()是伙伴系统的空闲链表加入封装它在__add_to_free_list()完成链表插入的基础上额外递增zone-free_area[order].nr_free。它被__free_one_page()在释放路径上调用是“页块进入伙伴系统”时维护空闲计数的标准入口。与它对称的是del_page_from_free_list()移出 递减计数两者共同保证nr_free的准确性。

关于本文作者

来自尧图内容编辑团队

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

尧图内容编辑团队

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

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

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

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

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

网站改版的5个关键决策

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

获取专属建站方案

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

立即免费咨询