selftests/mm: uffd_open_{dev|sys}()
authorPeter Xu <peterx@redhat.com>
Wed, 12 Apr 2023 16:42:54 +0000 (12:42 -0400)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 18 Apr 2023 23:30:05 +0000 (16:30 -0700)
Provide two helpers to open an uffd handle.  Drop the error checks around
SKIPs because it's inside an errexit() anyway, which IMHO doesn't really
help much if the test will not continue.

Link: https://lkml.kernel.org/r/20230412164254.328335-1-peterx@redhat.com
Signed-off-by: Peter Xu <peterx@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Mike Rapoport (IBM) <rppt@kernel.org>
Reviewed-by: Axel Rasmussen <axelrasmussen@google.com>
Cc: Dmitry Safonov <0x7f454c46@gmail.com>
Cc: Mike Kravetz <mike.kravetz@oracle.com>
Cc: Zach O'Keefe <zokeefe@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
tools/testing/selftests/mm/uffd-common.c
tools/testing/selftests/mm/vm_util.c
tools/testing/selftests/mm/vm_util.h

index daa5b5781e7a0f2a2db3a4510da19c0a2c53d719..09ea24c5f02c0005ab7a73252b2a8b8371e998de 100644 (file)
@@ -192,34 +192,16 @@ void uffd_stats_report(struct uffd_stats *stats, int n_cpus)
        printf("\n");
 }
 
-static int __userfaultfd_open_dev(void)
-{
-       int fd, _uffd;
-
-       fd = open("/dev/userfaultfd", O_RDWR | O_CLOEXEC);
-       if (fd < 0)
-               errexit(KSFT_SKIP, "opening /dev/userfaultfd failed");
-
-       _uffd = ioctl(fd, USERFAULTFD_IOC_NEW, UFFD_FLAGS);
-       if (_uffd < 0)
-               errexit(errno == ENOTTY ? KSFT_SKIP : 1,
-                       "creating userfaultfd failed");
-       close(fd);
-       return _uffd;
-}
-
 void userfaultfd_open(uint64_t *features)
 {
        struct uffdio_api uffdio_api;
 
        if (test_dev_userfaultfd)
-               uffd = __userfaultfd_open_dev();
-       else {
-               uffd = syscall(__NR_userfaultfd, UFFD_FLAGS);
-               if (uffd < 0)
-                       errexit(errno == ENOSYS ? KSFT_SKIP : 1,
-                               "creating userfaultfd failed");
-       }
+               uffd = uffd_open_dev(UFFD_FLAGS);
+       else
+               uffd = uffd_open_sys(UFFD_FLAGS);
+       if (uffd < 0)
+               err("uffd open failed (dev=%d)", test_dev_userfaultfd);
        uffd_flags = fcntl(uffd, F_GETFD, NULL);
 
        uffdio_api.api = UFFD_API;
index bb633d050d7164921b59f30f4ed342693eb704c0..5ee6c4688a7cc18385fc61149676e1f8458b2bf1 100644 (file)
@@ -3,6 +3,8 @@
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <linux/userfaultfd.h>
+#include <sys/syscall.h>
+#include <unistd.h>
 #include "../kselftest.h"
 #include "vm_util.h"
 
@@ -230,3 +232,25 @@ int uffd_unregister(int uffd, void *addr, uint64_t len)
 
        return ret;
 }
+
+int uffd_open_dev(unsigned int flags)
+{
+       int fd, uffd;
+
+       fd = open("/dev/userfaultfd", O_RDWR | O_CLOEXEC);
+       if (fd < 0)
+               return fd;
+       uffd = ioctl(fd, USERFAULTFD_IOC_NEW, flags);
+       close(fd);
+
+       return uffd;
+}
+
+int uffd_open_sys(unsigned int flags)
+{
+#ifdef __NR_userfaultfd
+       return syscall(__NR_userfaultfd, flags);
+#else
+       return -1;
+#endif
+}
index 3a9762022efd7710f34d1f0f34cc9fe9169c26b6..481354141533d64eb787e60362b7231571840d76 100644 (file)
@@ -48,6 +48,8 @@ unsigned long default_huge_page_size(void);
 int uffd_register(int uffd, void *addr, uint64_t len,
                  bool miss, bool wp, bool minor);
 int uffd_unregister(int uffd, void *addr, uint64_t len);
+int uffd_open_dev(unsigned int flags);
+int uffd_open_sys(unsigned int flags);
 
 /*
  * On ppc64 this will only work with radix 2M hugepage size