v3
2026-07-23
远程进程内存访问使用 per-VMA 锁 · v3
在__access_remote_vm()中引入per-VMA锁路径,减少mmap_lock竞争,并修复COWed页在VM_IO/VM_PFNMAP VMA中的访问问题。
原始补丁链接
子 Patch(6)
1/6
x86/mm: add untagged_addr_remote_unlocked()
新增 untagged_addr_remote_unlocked() 函数,允许在未持 mmap 锁时读取 mm->context.untag_mask,并用 READ_ONCE/WRITE_ONCE 注解以消除 KCSAN 警告。
2/6
riscv/mm: add untagged_addr_remote_unlocked()
为 riscv 添加 untagged_addr_remote_unlocked(),用 READ_ONCE 读取 mm->context.pmlen 以支持在无 mmap 锁时正确解标签远程地址。
3/6
mm: rename get_user_page_vma_remote() to get_user_page_lookup_vma()
将 get_user_page_vma_remote() 重命名为 get_user_page_lookup_vma(),清理命名空间以便后续添加已持 VMA 锁的变体。
4/6
mm/gup: add get_user_page_vma() to fault in a page under a held lock
新增 get_user_page_vma() 函数,在已持 VMA 锁或 mmap 锁下通过 follow_page_mask/faultin_page 获取单页,支持 FOLL_VMA_LOCK 标志。
5/6
mm: use per-VMA lock in __access_remote_vm() for single-VMA accesses
在 __access_remote_vm() 中优先使用 per-VMA 锁访问单 VMA 内的远程内存,仅在跨 VMA 或失败时回退到 mmap 锁,减少锁竞争。
6/6
selftests/mm: cover /proc/pid/mem access to VM_PFNMAP memory
在 pfnmap.c 中添加两个测试用例,通过 /proc/self/mem 验证 get_user_page_vma() 对 COWed 页和 raw PFN 的访问路径。