Message ID | 20230606071637.267103-10-jhubbard@nvidia.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 56d2afff13834020b91a81220684be946a4e1ef3 |
Headers | show |
Series | A minor flurry of selftest/mm fixes | expand |
On 6/6/23 12:16 PM, John Hubbard wrote: > There are only three uffd*() routines that are used outside of the uffd > selftests. Leave these in vm_util.c, where they are available to any mm > selftest program: > > uffd_register() > uffd_unregister() > uffd_register_with_ioctls(). > > A few other uffd*() routines, however, are only used by the uffd-focused > tests found in uffd-stress.c and uffd-unit-tests.c. Move those routines > into uffd-common.c. > > Cc: Peter Xu <peterx@redhat.com> > Acked-by: David Hildenbrand <david@redhat.com> > Signed-off-by: John Hubbard <jhubbard@nvidia.com> Tested-by: Muhammad Usama Anjum <usama.anjum@collabora.com> > --- > tools/testing/selftests/mm/uffd-common.c | 59 ++++++++++++++++++++++++ > tools/testing/selftests/mm/uffd-common.h | 5 ++ > tools/testing/selftests/mm/vm_util.c | 59 ------------------------ > tools/testing/selftests/mm/vm_util.h | 4 -- > 4 files changed, 64 insertions(+), 63 deletions(-) > > diff --git a/tools/testing/selftests/mm/uffd-common.c b/tools/testing/selftests/mm/uffd-common.c > index 61c6250adf93..ba20d7504022 100644 > --- a/tools/testing/selftests/mm/uffd-common.c > +++ b/tools/testing/selftests/mm/uffd-common.c > @@ -616,3 +616,62 @@ int copy_page(int ufd, unsigned long offset, bool wp) > { > return __copy_page(ufd, offset, false, wp); > } > + > +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 > +} > + > +int uffd_open(unsigned int flags) > +{ > + int uffd = uffd_open_sys(flags); > + > + if (uffd < 0) > + uffd = uffd_open_dev(flags); > + > + return uffd; > +} > + > +int uffd_get_features(uint64_t *features) > +{ > + struct uffdio_api uffdio_api = { .api = UFFD_API, .features = 0 }; > + /* > + * This should by default work in most kernels; the feature list > + * will be the same no matter what we pass in here. > + */ > + int fd = uffd_open(UFFD_USER_MODE_ONLY); > + > + if (fd < 0) > + /* Maybe the kernel is older than user-only mode? */ > + fd = uffd_open(0); > + > + if (fd < 0) > + return fd; > + > + if (ioctl(fd, UFFDIO_API, &uffdio_api)) { > + close(fd); > + return -errno; > + } > + > + *features = uffdio_api.features; > + close(fd); > + > + return 0; > +} > diff --git a/tools/testing/selftests/mm/uffd-common.h b/tools/testing/selftests/mm/uffd-common.h > index 6068f2346b86..197f5262fe0d 100644 > --- a/tools/testing/selftests/mm/uffd-common.h > +++ b/tools/testing/selftests/mm/uffd-common.h > @@ -110,6 +110,11 @@ int __copy_page(int ufd, unsigned long offset, bool retry, bool wp); > int copy_page(int ufd, unsigned long offset, bool wp); > void *uffd_poll_thread(void *arg); > > +int uffd_open_dev(unsigned int flags); > +int uffd_open_sys(unsigned int flags); > +int uffd_open(unsigned int flags); > +int uffd_get_features(uint64_t *features); > + > #define TEST_ANON 1 > #define TEST_HUGETLB 2 > #define TEST_SHMEM 3 > diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c > index 9b06a5034808..681277615839 100644 > --- a/tools/testing/selftests/mm/vm_util.c > +++ b/tools/testing/selftests/mm/vm_util.c > @@ -242,62 +242,3 @@ 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 > -} > - > -int uffd_open(unsigned int flags) > -{ > - int uffd = uffd_open_sys(flags); > - > - if (uffd < 0) > - uffd = uffd_open_dev(flags); > - > - return uffd; > -} > - > -int uffd_get_features(uint64_t *features) > -{ > - struct uffdio_api uffdio_api = { .api = UFFD_API, .features = 0 }; > - /* > - * This should by default work in most kernels; the feature list > - * will be the same no matter what we pass in here. > - */ > - int fd = uffd_open(UFFD_USER_MODE_ONLY); > - > - if (fd < 0) > - /* Maybe the kernel is older than user-only mode? */ > - fd = uffd_open(0); > - > - if (fd < 0) > - return fd; > - > - if (ioctl(fd, UFFDIO_API, &uffdio_api)) { > - close(fd); > - return -errno; > - } > - > - *features = uffdio_api.features; > - close(fd); > - > - return 0; > -} > diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h > index 07f39ed2efba..c2d4ff798b91 100644 > --- a/tools/testing/selftests/mm/vm_util.h > +++ b/tools/testing/selftests/mm/vm_util.h > @@ -48,10 +48,6 @@ 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); > -int uffd_open(unsigned int flags); > -int uffd_get_features(uint64_t *features); > int uffd_register_with_ioctls(int uffd, void *addr, uint64_t len, > bool miss, bool wp, bool minor, uint64_t *ioctls); >
diff --git a/tools/testing/selftests/mm/uffd-common.c b/tools/testing/selftests/mm/uffd-common.c index 61c6250adf93..ba20d7504022 100644 --- a/tools/testing/selftests/mm/uffd-common.c +++ b/tools/testing/selftests/mm/uffd-common.c @@ -616,3 +616,62 @@ int copy_page(int ufd, unsigned long offset, bool wp) { return __copy_page(ufd, offset, false, wp); } + +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 +} + +int uffd_open(unsigned int flags) +{ + int uffd = uffd_open_sys(flags); + + if (uffd < 0) + uffd = uffd_open_dev(flags); + + return uffd; +} + +int uffd_get_features(uint64_t *features) +{ + struct uffdio_api uffdio_api = { .api = UFFD_API, .features = 0 }; + /* + * This should by default work in most kernels; the feature list + * will be the same no matter what we pass in here. + */ + int fd = uffd_open(UFFD_USER_MODE_ONLY); + + if (fd < 0) + /* Maybe the kernel is older than user-only mode? */ + fd = uffd_open(0); + + if (fd < 0) + return fd; + + if (ioctl(fd, UFFDIO_API, &uffdio_api)) { + close(fd); + return -errno; + } + + *features = uffdio_api.features; + close(fd); + + return 0; +} diff --git a/tools/testing/selftests/mm/uffd-common.h b/tools/testing/selftests/mm/uffd-common.h index 6068f2346b86..197f5262fe0d 100644 --- a/tools/testing/selftests/mm/uffd-common.h +++ b/tools/testing/selftests/mm/uffd-common.h @@ -110,6 +110,11 @@ int __copy_page(int ufd, unsigned long offset, bool retry, bool wp); int copy_page(int ufd, unsigned long offset, bool wp); void *uffd_poll_thread(void *arg); +int uffd_open_dev(unsigned int flags); +int uffd_open_sys(unsigned int flags); +int uffd_open(unsigned int flags); +int uffd_get_features(uint64_t *features); + #define TEST_ANON 1 #define TEST_HUGETLB 2 #define TEST_SHMEM 3 diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c index 9b06a5034808..681277615839 100644 --- a/tools/testing/selftests/mm/vm_util.c +++ b/tools/testing/selftests/mm/vm_util.c @@ -242,62 +242,3 @@ 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 -} - -int uffd_open(unsigned int flags) -{ - int uffd = uffd_open_sys(flags); - - if (uffd < 0) - uffd = uffd_open_dev(flags); - - return uffd; -} - -int uffd_get_features(uint64_t *features) -{ - struct uffdio_api uffdio_api = { .api = UFFD_API, .features = 0 }; - /* - * This should by default work in most kernels; the feature list - * will be the same no matter what we pass in here. - */ - int fd = uffd_open(UFFD_USER_MODE_ONLY); - - if (fd < 0) - /* Maybe the kernel is older than user-only mode? */ - fd = uffd_open(0); - - if (fd < 0) - return fd; - - if (ioctl(fd, UFFDIO_API, &uffdio_api)) { - close(fd); - return -errno; - } - - *features = uffdio_api.features; - close(fd); - - return 0; -} diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h index 07f39ed2efba..c2d4ff798b91 100644 --- a/tools/testing/selftests/mm/vm_util.h +++ b/tools/testing/selftests/mm/vm_util.h @@ -48,10 +48,6 @@ 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); -int uffd_open(unsigned int flags); -int uffd_get_features(uint64_t *features); int uffd_register_with_ioctls(int uffd, void *addr, uint64_t len, bool miss, bool wp, bool minor, uint64_t *ioctls);