v2 2026-09-02

优化ARM64 this_cpu操作 · v2

ARM64实现本地per-CPU映射优化this_cpu_*()操作,引入HAVE_LOCAL_PER_CPU_MAP配置。

原始补丁链接

子 Patch(16)

1/16
drivers: arch_numa: move percpu set up code to arch
将 percpu 设置代码从通用 arch_numa.c 移至 ARM64/RISC-V 的 smp.c,避免因两者都选 GENERIC_ARCH_NUMA 导致的多重定义问题。
2/16
arm64: kconfig: make percpu related configs not depend on NUMA
解除 ARM64 上 percpu 相关 Kconfig 对 NUMA 的依赖,因 percpu 设置代码已移出 arch_numa.c,不再需要 NUMA 条件。
3/16
mm: pgalloc: introduce {pud|pmd}_populate_sync()
引入 {pud|pmd}_populate_sync() 新 API,用于 percpu 和 vmemmap 填充页表时同步内核页表,避免修改所有架构的现有调用点。
4/16
vmalloc: pass in pgd pointer for vmap{__vunmap}_range_noflush()
修改 vmap{__vunmap}_range_noflush() 以接收 pgd 指针参数,不再假设操作 init_mm pgd,为后续 percpu 页表映射做准备。
5/16
arm64: mm: enable percpu kernel page table
为 ARM64 每个 CPU 创建独立内核页表(仅 pgd 不同),共享内容,同步顶层修改;禁用 CNP,暂不支持内存热插拔和 KASAN。
6/16
arm64: mm: defined {pud|pmd}_populate_sync()
实现 ARM64 特有的 {pud|pmd}_populate_sync(),用于同步 percpu 页表与 swapper_pg_dir 的页表修改。
7/16
arm64: mm: sync percpu page table for memory hotplug/unplug
在内存热插拔/拔时同步 percpu 页表,涵盖线性映射和 vmemmap 区域,确保 percpu 页表与 swapper_pg_dir 一致。
8/16
arm64: kasan: sync up kasan shadow area page table
在 KASAN 初始化时同步 percpu 页表,确保 vmalloc 和 percpu 分配时 KASAN 影子区域页表在 percpu 页表中正确映射。
9/16
arm64: mm: define percpu virtual space area
在 ARM64 中划出专用全局和本地 percpu 虚拟地址区域(各 2*PGDIR_SIZE),对齐顶级页表项,避免浪费 vmalloc 空间。
10/16
mm: percpu: prepare to use dedicated percpu area
引入 CONFIG_HAVE_LOCAL_PER_CPU_MAP,使支持本地 percpu 映射的架构(如 ARM64)从专用 percpu 区域分配变量,但仍视为 vmalloc 地址。
11/16
arm64: mm: map local percpu first chunk
为 ARM64 分配本地 percpu 区域并映射到 percpu 页表,仅支持 PCPU_FC_PAGE 模式,取消 NEED_PER_CPU_EMBED_FIRST_CHUNK 选择。
12/16
mm: percpu: set up first chunk and reserve chunk
Set up the first chunk and reserve chunk with local percpu map. Signed-off-by: Yang Shi yang@os.amperecomputing.com — include/linux/percpu.h | 2 +- mm/percpu-internal.h | 2 ++ mm/percpu.c
13/16
arm64: mm: introduce __per_cpu_local_off
this_cpu_*() ops will use it to get the local percpu address. It has the same value for all CPUs. Also introduce pcpu_local_base, which is the base address of local percpu map. Signed-off-by: Yang
14/16
mm: percpu: allocate and free local percpu vm area
Allocate local percpu vm area. The delta between the allocated addr (chunk local base) and pcpu_local_base must be same with the delta between chunk base and pcpu_base_addr. Each CPU’s local percpu
15/16
arm64: kconfig: select HAVE_LOCAL_PER_CPU_MAP
ARM64 supports local percpu map, so select HAVE_LOCAL_PER_CPU_MAP. But it depends on VA bits and page size for now. Signed-off-by: Yang Shi yang@os.amperecomputing.com — arch/arm64/Kconfig | 5 +
16/16
arm64: percpu: use local percpu for this_cpu_*() APIs
Use local percpu address for this_cpu_*() APIs. Because the percpu variable is mapped to the same virtual address, their address can be calculated by using __per_cpu_local_off which has same value fo