v10 2026-10-02

连续内存加速 vmap · v10

v10 系列为 vmalloc/arm64 引入 pte_set_huge,批量映射连续页并消除大 page_shift 页表重走。

原始补丁链接

子 Patch(10)

1/10
arm64/mm: add pte_set_huge() and pte_clear_huge()
arm64 新增 pte_set_huge/clear_huge,基于 __set_ptes/__get_and_clear_full_ptes 装清 CONT_PTE,解除 vmap 对 CONFIG_HUGETLB_PAGE 的依赖。
2/10
powerpc/8xx: add pte_set_huge()
powerpc/8xx 实现 pte_set_huge,直接拼装 SZ_16K/SZ_512K 大 PTE 写入 backing cells,避免 vmap 依赖受 CONFIG_HUGETLB_PAGE 控制的 set_huge_pte_at。
3/10
mm/vmalloc: use pte_set_huge()/pte_clear_huge() for PTE-level block mappings
vmap/vunmap PTE 块映射改用 pte_set_huge/clear_huge,补 BUILD_BUG 回退并去掉 CONFIG_HUGETLB_PAGE 守卫,无 HugeTLB 内核也可用。
4/10
arm64/hugetlb: drop the init_mm special case in clear_flush()
arm64 clear_flush 删除 mm==&init_mm 调 flush_tlb_kernel_range 的特判;vmap 改用 pte_set_huge/clear_huge 后不再经 set_huge_pte_at(&init_mm)。
5/10
arm64/vmalloc: allow arch_vmap_pte_range_map_size() to batch multiple CONT_PTE
arch_vmap_pte_range_map_size 对 CONT_PTE 对齐区间返回剩余范围和 max_page_shift 允许的最大批量,而非单个 CONT_PTE_SIZE,减少 pte_set_huge 与 TLB flush。
6/10
mm/vmalloc: extract vmap_set_ptes() to consolidate PTE mapping logic
从 vmap_pte_range 抽出 vmap_set_ptes,统一 CONT_PTE 与普通 PTE 安装,为 vmap_pages_pte_range 复用铺路,纯重构无行为变化。
7/10
mm/vmalloc: extend page table walk to support larger page_shift sizes and eliminate page table rewalk
扩展 vmap_pages_range_noflush_walk 支持大 page_shift、PMD 和连续 PTE 映射;VM_ALLOW_HUGE_VMAP 的 vmalloc 统一走它,消除页表重走。
8/10
mm/vmalloc: extract vm_shift() to consolidate mapping shift selection
从 __vmalloc_node_range_noprof 抽出 vm_shift,集中选择 vmalloc 映射 shift,供 vmap 批处理复用,纯重构无行为变化。
9/10
mm/vmalloc: map contiguous pages in batches for vmap() if possible
vmap 用 num_pages_contiguous 扫描连续页,按连续页数和 pfn 对齐取小定映射阶,合并同 page_shift 经 vmap_pages_range_noflush_walk 批量映射,遇 order-0 停止。
10/10
mm/vmalloc: align vm_area so vmap() can batch mappings
vm_area 虚拟地址按 PMD_SHIFT 或架构更大 PTE 尺寸对齐,使 vmap 能批量设 PMD/PTE,并加 __get_vm_area_node_aligned_caller 包装 __get_vm_area_node。