Commit 78391f64 authored by Peter Xu's avatar Peter Xu Committed by Andrew Morton
Browse files

selftests/mm: uffd_open_{dev|sys}()

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: default avatarPeter Xu <peterx@redhat.com>
Reviewed-by: default avatarDavid Hildenbrand <david@redhat.com>
Reviewed-by: default avatarMike Rapoport (IBM) <rppt@kernel.org>
Reviewed-by: default avatarAxel 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: default avatarAndrew Morton <akpm@linux-foundation.org>
parent c4277cb6
Loading
Loading
Loading
Loading
+5 −23
Original line number Diff line number Diff line
@@ -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);
		uffd = uffd_open_dev(UFFD_FLAGS);
	else
		uffd = uffd_open_sys(UFFD_FLAGS);
	if (uffd < 0)
			errexit(errno == ENOSYS ? KSFT_SKIP : 1,
				"creating userfaultfd failed");
	}
		err("uffd open failed (dev=%d)", test_dev_userfaultfd);
	uffd_flags = fcntl(uffd, F_GETFD, NULL);

	uffdio_api.api = UFFD_API;
+24 −0
Original line number Diff line number Diff line
@@ -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
}
+2 −0
Original line number Diff line number Diff line
@@ -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