mm/userfaultfd: fail uffd-wp registration if not supported
We should fail uffd-wp registration immediately if the arch does not even have CONFIG_HAVE_ARCH_USERFAULTFD_WP defined. That'll block also relevant ioctls on e.g. UFFDIO_WRITEPROTECT because that'll check against VM_UFFD_WP, which can only be applied with a success registration. Remove the WP feature bit too for those archs when handling UFFDIO_API ioctl. Link: https://lkml.kernel.org/r/20210428225030.9708-5-peterx@redhat.com Signed-off-by: Peter Xu <peterx@redhat.com> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Axel Rasmussen <axelrasmussen@google.com> Cc: Brian Geffon <bgeffon@google.com> Cc: "Dr . David Alan Gilbert" <dgilbert@redhat.com> Cc: Hugh Dickins <hughd@google.com> Cc: Jerome Glisse <jglisse@redhat.com> Cc: Joe Perches <joe@perches.com> Cc: Kirill A. Shutemov <kirill@shutemov.name> Cc: Lokesh Gidra <lokeshgidra@google.com> Cc: Mike Kravetz <mike.kravetz@oracle.com> Cc: Mike Rapoport <rppt@linux.vnet.ibm.com> Cc: Mina Almasry <almasrymina@google.com> Cc: Oliver Upton <oupton@google.com> Cc: Shaohua Li <shli@fb.com> Cc: Shuah Khan <shuah@kernel.org> Cc: Stephen Rothwell <sfr@canb.auug.org.au> Cc: Wang Qing <wangqing@vivo.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
8f34f1eac3
commit
00b151f21f
|
@ -1304,8 +1304,12 @@ static int userfaultfd_register(struct userfaultfd_ctx *ctx,
|
||||||
vm_flags = 0;
|
vm_flags = 0;
|
||||||
if (uffdio_register.mode & UFFDIO_REGISTER_MODE_MISSING)
|
if (uffdio_register.mode & UFFDIO_REGISTER_MODE_MISSING)
|
||||||
vm_flags |= VM_UFFD_MISSING;
|
vm_flags |= VM_UFFD_MISSING;
|
||||||
if (uffdio_register.mode & UFFDIO_REGISTER_MODE_WP)
|
if (uffdio_register.mode & UFFDIO_REGISTER_MODE_WP) {
|
||||||
|
#ifndef CONFIG_HAVE_ARCH_USERFAULTFD_WP
|
||||||
|
goto out;
|
||||||
|
#endif
|
||||||
vm_flags |= VM_UFFD_WP;
|
vm_flags |= VM_UFFD_WP;
|
||||||
|
}
|
||||||
if (uffdio_register.mode & UFFDIO_REGISTER_MODE_MINOR) {
|
if (uffdio_register.mode & UFFDIO_REGISTER_MODE_MINOR) {
|
||||||
#ifndef CONFIG_HAVE_ARCH_USERFAULTFD_MINOR
|
#ifndef CONFIG_HAVE_ARCH_USERFAULTFD_MINOR
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1942,6 +1946,9 @@ static int userfaultfd_api(struct userfaultfd_ctx *ctx,
|
||||||
uffdio_api.features = UFFD_API_FEATURES;
|
uffdio_api.features = UFFD_API_FEATURES;
|
||||||
#ifndef CONFIG_HAVE_ARCH_USERFAULTFD_MINOR
|
#ifndef CONFIG_HAVE_ARCH_USERFAULTFD_MINOR
|
||||||
uffdio_api.features &= ~UFFD_FEATURE_MINOR_HUGETLBFS;
|
uffdio_api.features &= ~UFFD_FEATURE_MINOR_HUGETLBFS;
|
||||||
|
#endif
|
||||||
|
#ifndef CONFIG_HAVE_ARCH_USERFAULTFD_WP
|
||||||
|
uffdio_api.features &= ~UFFD_FEATURE_PAGEFAULT_FLAG_WP;
|
||||||
#endif
|
#endif
|
||||||
uffdio_api.ioctls = UFFD_API_IOCTLS;
|
uffdio_api.ioctls = UFFD_API_IOCTLS;
|
||||||
ret = -EFAULT;
|
ret = -EFAULT;
|
||||||
|
|
Loading…
Reference in New Issue