ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

init add_pages

init add_pages add_pages是 Linux 内存热插拔Memory Hotplug机制中的核心函数负责向系统动态添加一段物理内存区域。它位于mm/memory_hotplug.c是__add_pages的封装额外处理了max_pfn更新和地址范围校验。核心作用动态扩展物理内存当系统运行期间需要“热添加”内存时如虚拟机动态分配、物理服务器内存热插拔内核通过add_pages将新的物理页帧纳入内存管理子系统使其能被分配器使用。代码逻辑解析int add_pages(int nid, unsigned long start_pfn, unsigned long nr_pages, struct mhp_params *params) { unsigned long end ((start_pfn nr_pages) PAGE_SHIFT) - 1; int ret; if (WARN_ON_ONCE(end DIRECT_MAP_PHYSMEM_END)) return -ERANGE; ret __add_pages(nid, start_pfn, nr_pages, params); WARN_ON_ONCE(ret); if (!params-pgmap) update_end_of_memory_vars(start_pfn PAGE_SHIFT, nr_pages PAGE_SHIFT); return ret; }边界校验计算结束物理地址end检查是否超出DIRECT_MAP_PHYSMEM_END直接映射区能覆盖的最大物理地址。如果超出返回-ERANGE。这是一个WARN_ON_ONCE因为正常情况下不会发生。委托核心操作调用__add_pages()执行实际的添加操作——为新内存建立struct page数组、初始化页帧、更新 zone 信息等。条件更新内存边界如果params-pgmap非空说明这是memremap_pages()调用用于添加设备私有内存如 GPU 显存、持久内存。此时不能更新max_pfn等全局变量因为max_pfn会影响dma_addressing_limited()的返回值。如果max_pfn被错误地扩大到设备内存范围dma_addressing_limited()会认为设备地址有限强制驱动程序使用 bounce buffer严重损害性能。只有当pgmap为空普通内存热插拔时才调用update_end_of_memory_vars()更新max_pfn、max_low_pfn和high_memory。返回结果WARN_ON_ONCE(ret)在失败时记录警告最终返回__add_pages的结果。调用场景调用者场景pgmap内存热插拔物理内存热添加NULLdevm_memremap_pages()设备私有内存如 GPU、PMEM非空关键设计为什么设备私有内存要特殊处理设备私有内存如 NVIDIA GPU 的显存虽然被映射到 CPU 地址空间但它不是系统 RAM不能用于普通内存分配。如果max_pfn被更新到包含设备内存dma_addressing_limited()会错误地认为系统的 DMA 寻址范围有限导致所有设备都被强制使用 bounce buffer——即使它们的 DMA 能力完全足够。这个!params-pgmap检查正是为了避免这种性能陷阱。
返回列表