资讯动态

page_alloc adjust_managed_page_count

发布时间:2026/10/18 6:05:22 来源:尧图企业网站定制
低端内存保留区的初始化和管理页计数的调整。一、setup_per_zone_lowmem_reserve()static void setup_per_zone_lowmem_reserve(void);前置声明告诉编译器这个函数存在实际定义在后面。作用初始化每个 zone 的lowmem_reserve[]数组。static文件内私有。背景回顾sysctl_lowmem_reserve_ratio[]——每个 zone 的保留比例。setup_per_zone_lowmem_reserve()就是根据这些比例为每个 zone 计算出实际的保留页数lowmem_reserve[zone] managed_pages[zone] / ratio[zone]它被setup_per_zone_wmarks()或init_per_zone_wmark_min()等函数在 zone 初始化、内存热插拔、sysctl 修改时调用确保低端 zone 有足够的保留内存防止高端分配将其耗尽。二、adjust_managed_page_count()void adjust_managed_page_count(struct page *page, long count)作用调整 zone 和节点的managed_pages计数。managed_pages表示该 zone 中由伙伴系统管理的页数排除 reserved、CMA 预留等不可分配的页。为什么需要它managed_pages是内存管理的关键基准值用于水位计算WMARK_MIN/WMARK_LOW/WMARK_HIGH按managed_pages的比例计算lowmem reservelowmem_reserve[]按managed_pages/ ratio 计算PCP 配置zone_batchsize()和zone_highsize()都基于managed_pages统计信息/proc/zoneinfo、/proc/meminfo等。当某些页从可管理变为不可管理或反之时必须同步更新这个计数。典型实现void adjust_managed_page_count(struct page *page, long count) { atomic_long_add(count, page_zone(page)-managed_pages); totalram_pages_add(count); #ifdef CONFIG_HIGHMEM if (PageHighMem(page)) totalhigh_pages_add(count); #endif } EXPORT_SYMBOL(adjust_managed_page_count);逐步解析1. 调整 zone 的managed_pagesatomic_long_add(count, page_zone(page)-managed_pages);count可正可负正表示增加可管理页如内存热插拔上线、CMA 释放负表示减少如内存下线、balloon 占用。用atomic_long_add保证并发安全——内存热插拔和分配路径可能并发访问。page_zone(page)获取页所属 zone。2. 调整全局totalram_pagestotalram_pages_add(count);totalram_pages是系统总可用 RAM 页数的全局计数。用于/proc/meminfo的MemTotal等。totalram_pages_add()内部也是对atomic_long_t做加法。3. 调整totalhigh_pages仅 HIGHMEM#ifdef CONFIG_HIGHMEM if (PageHighMem(page)) totalhigh_pages_add(count); #endif在 32 位系统上ZONE_HIGHMEM的页数单独统计为totalhigh_pages。用于/proc/meminfo的HighTotal/HighFree。典型调用场景1. 内存热插拔上线online_pages()→adjust_managed_page_count(page, pages)增加计数下线offline_pages()→adjust_managed_page_count(page, -pages)减少计数。2. CMA 预留CMA 区域从伙伴系统划出时可能调整managed_pages。3. Balloon 驱动Xen/KVM balloon 占用/释放内存时调整计数。4.free_area_init初始化初始化时设置 zone 的初始managed_pages。5.init_cma_reserved_pageblockCMA 页块初始化时调整。与zone-managed_pages的并发managed_pages是atomic_long_t用atomic_long_add保证原子性。但读取时可能看到不一致的值正在更新中这对水位判断等是可接受的——它们只需近似值不需要精确一致。与totalram_pages的区别计数范围用途zone-managed_pages单个 zone水位、lowmem reserve、PCP 配置totalram_pages全局/proc/meminfo的MemTotaltotalhigh_pages全局仅 HIGHMEM/proc/meminfo的HighTotal三、小结表项说明setup_per_zone_lowmem_reserve()前置声明初始化 zone 的 lowmem reserveadjust_managed_page_count(page, count)调整 zone 和全局的 managed_pages 计数参数count可正可负表示可管理页的增减关键操作atomic_long_add到zone-managed_pagestotalram_pagestotalhigh_pages导出EXPORT_SYMBOL供模块使用典型调用内存热插拔、CMA、balloon、初始化并发原子操作读侧可能看到近似值一句话总结setup_per_zone_lowmem_reserve()是低端内存保留区初始化的前置声明adjust_managed_page_count()则是调整 zone 和全局managed_pages计数的公开接口——它用原子操作增减zone-managed_pages、totalram_pages和totalhigh_pages用于内存热插拔、CMA、balloon 等改变可管理页数的场景是水位计算、lowmem reserve 和 PCP 配置等核心机制的基准值维护函数。

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

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

免费获取报价 →
↑