v2
2026-08-04
修复 pfn_mkwrite 与 fixup_user_fault 交互 · v2
组合 KVM VMA 权限检查、follow_pfnmap_start() 可写性检查,统一 .pfn_mkwrite 与 fixup_user_fault() 的写缺页行为,使驱动无需 .fault() 后再调 .pfn_mkwrite()。
原始补丁链接
子 Patch(6)
1/6
mm: export vmf_insert_pfn_prot_mkwrite(), change variants to inline
新增并导出 vmf_insert_pfn_mkwrite()/vmf_insert_pfn_prot_mkwrite(),让 .pfn_mkwrite 驱动能插入经 maybe_mkwrite 的可写 PTE,避免 fixup_user_fault 二次缺页。
2/6
drm/shmem_helper: use vmf_insert_pfn_mkwrite()
drm_gem_shmem_helper 改用 vmf_insert_pfn_mkwrite() 插入可写 PTE,确保 KVM/VFIO 请求写映射时能看到可写 PTE,避免 guest 写触发 EFAULT。
3/6
drm/ttm, drm/vmwgfx: directly create writable PTEs when mkwrite is in use
TTM/vmwgfx 在启用 mkwrite 时直接生成可写 PTE,fixup_user_fault 用户无需再触发回调;vmw_bo_vm_fault 手动记录写 fault,因为 .pfn_mkwrite 不再调用。
4/6
kvm: apply VM_READ/VM_WRITE checks to all VMA types
将 VM_READ/VM_WRITE 检查提前到 hva_to_pfn() 统一执行,避免 hva_to_pfn_remapped() 依赖 fixup_user_fault 导致 PFNMAP 与普通映射错误码不一致。
5/6
mm: pull writability check to follow_pfnmap_start()
在 follow_pfnmap_start() 内用 args.write_fault 检查可写性,调用者错误后尝试 fixup_user_fault;同时修复 s390_pci_mmio_write 缺检查和只读 PFN 返回 0 的问题。
6/6
kvm: return -EFAULT for writes to !VM_WRITE IO mappings
hva_to_pfn() 对不可写 VMA 统一返回 KVM_PFN_ERR_FAULT,不再让 PFNMAP 映射产生 KVM_EXIT_MMIO;KVM_EXIT_MMIO 仅限显式只读 memslot。