v10 2026-08-10

优化 ZONE_DEVICE memmap 初始化 · v10

重构ZONE_DEVICE页初始化,新增模板快速路径及复合尾页支持,引入memcpy_nontemporal()并扩展x86快速路径。

原始补丁链接

子 Patch(8)

1/8
mm: fix stale ZONE_DEVICE refcount comment
修正 __init_zone_device_page() 过时注释:明确仅 MEMORY_DEVICE_GENERIC 在释放路径恢复 refcount=1,其余 ZONE_DEVICE 从 0 开始、由分配器/驱动交付时再抬高。无功能变化。
2/8
mm: factor zone-device page init helpers out of __init_zone_device_page
拆分 memmap_init_zone_device() 中 refcount 策略与通用页初始化:新增 pagemap_requires_refcount_reset()、__zone_device_page_init() 和 zone_device_page_init_slow(),慢路径行为不变,为后续复用提供边界。
3/8
mm: add a set_page_section_from_pfn() helper
新增 set_page_section_from_pfn() 封装 set_page_section(page, pfn_to_section_nr(pfn)),按 SECTION_IN_PAGE_FLAGS 提供实现或 no-op,并让 set_page_links() 使用它,避免各调用点开架构宏。
4/8
mm: add a template-based fast path for zone-device page init
为 memmap_init_zone_device() 增加模板复制快路径:先用慢路径构造一个 ZONE_DEVICE 头页模板,刷新 PFN 相关字段后 memcpy 到各目标页。无条件使用;page_ref_set 不再看到初始化期 refcount 赋值,最终状态不变。
5/8
mm: extend the template fast path to zone-device compound tails
将模板快路径扩展到 compound tail:分别构造头/尾模板,尾模板在复合页内复用;head 保持原 refcount 策略,tail 在 prep_compound_tail() 后从 0 开始。支持 pfns_per_compound>1,行为不变。
6/8
string: introduce memcpy_nontemporal()
引入 memcpy_nontemporal():x86_64 复用 memcpy_flushcache() 后端,通用 fallback 直接 memcpy 以保留 FORTIFY;仅复制原语,不隐含 drain/barrier,供 ZONE_DEVICE 模板复制减少缓存污染。
7/8
mm: use memcpy_nontemporal() in zone-device template copies
把 zone_device_page_init_from_template() 的 memcpy() 换成 memcpy_nontemporal()。ZONE_DEVICE memmap 初始化是 write-once,非临时存储可避免 x86 写分配与缓存污染;无专门 drain,无后端时退回 memcpy()。
8/8
x86/string: extend memcpy_flushcache() fixed-size fastpaths
扩展 x86 memcpy_flushcache() 内联 fastpath,新增到 96 字节的固定大小 MOVNTI 分支,使 sizeof(struct page)(64/80/96 字节)复制不再落入 __memcpy_flushcache();ZONE_DEVICE 每页一次复制,100GB fsdax 约 2500 万次受益。