userfaultfd 现在支持文件支持的映射吗?

Kel*_*Lee 2 linux memory-management shared-memory memory-mapped-files linux-kernel

我从userfaultfd的文档中看到

https://manpages.debian.org/testing/manpages-dev/userfaultfd.2.en.html http://man7.org/linux/man-pages/man2/ioctl_userfaultfd.2.html

userfaultfd 从内核 4.11 开始支持共享映射。然而,文档看起来仍然非常模糊,因为我仍然想知道这些是否包括支持文件支持的 mmap(也可以是 MAP_SHARED)?

Mic*_*kis 6

为了明确回答,由于该信息不在手册页中,因此我们可以查看来源。

\n

尝试使用地址范围注册 userfaultfd 对象必须检查该范围是否“兼容”:

\n
\xe2\x80\xa6\n/* check not compatible vmas */\nret = -EINVAL;\nif (!vma_can_userfault(cur))\n    goto out_unlock;\n
Run Code Online (Sandbox Code Playgroud)\n

兼容性的定义为:

\n
if ((vm_flags & VM_UFFD_MINOR) &&\n    (!is_vm_hugetlb_page(vma) && !vma_is_shmem(vma)))\n    return false;\n#ifndef CONFIG_PTE_MARKER_UFFD_WP\n/*\n * If user requested uffd-wp but not enabled pte markers for\n * uffd-wp, then shmem & hugetlbfs are not supported but only\n * anonymous.\n */\nif ((vm_flags & VM_UFFD_WP) && !vma_is_anonymous(vma))\n    return false;\n#endif\nreturn vma_is_anonymous(vma) || is_vm_hugetlb_page(vma) ||\n    vma_is_shmem(vma);\n
Run Code Online (Sandbox Code Playgroud)\n

因此,匿名映射或映射在:

\n
    \n
  • tmpfs-backed,又名共享内存虚拟文件系统(tmpfs,shmget)映射是兼容的
  • \n
  • 当 CONFIG_SHMEM 禁用时,已重新映射(使用generic_file_mmap)为共享的文件支持范围也兼容
  • \n
\n

的含义VM_UFFD_MINOR是支持小页面错误的通知。

\n