From: Mike Rapoport <rppt@linux.ibm.com>
To: Peter Xu <peterx@redhat.com>
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
Mike Kravetz <mike.kravetz@oracle.com>,
Mike Rapoport <rppt@linux.vnet.ibm.com>,
Andrea Arcangeli <aarcange@redhat.com>,
Leonardo Bras Soares Passos <lsoaresp@redhat.com>,
Andrew Morton <akpm@linux-foundation.org>,
David Hildenbrand <david@redhat.com>,
Axel Rasmussen <axelrasmussen@google.com>,
Nadav Amit <nadav.amit@gmail.com>
Subject: Re: [PATCH 21/29] selftests/mm: Add framework for uffd-unit-test
Date: Tue, 11 Apr 2023 14:09:51 +0300 [thread overview]
Message-ID: <ZDU//1RXYUMIRMk3@linux.ibm.com> (raw)
In-Reply-To: <20230330160818.3107545-1-peterx@redhat.com>
On Thu, Mar 30, 2023 at 12:08:18PM -0400, Peter Xu wrote:
> Add a framework to be prepared to move unit tests from uffd-stress.c into
> uffd-unit-tests.c. The goal is to allow detection of uffd features for
> each test, and also loop over specified types of memory that a test support.
>
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
> tools/testing/selftests/mm/uffd-unit-tests.c | 125 +++++++++++++++++++
> tools/testing/selftests/mm/vm_util.c | 27 ++++
> tools/testing/selftests/mm/vm_util.h | 1 +
> 3 files changed, 153 insertions(+)
>
> diff --git a/tools/testing/selftests/mm/uffd-unit-tests.c b/tools/testing/selftests/mm/uffd-unit-tests.c
> index dfb44ffad5f5..007145063363 100644
> --- a/tools/testing/selftests/mm/uffd-unit-tests.c
> +++ b/tools/testing/selftests/mm/uffd-unit-tests.c
> @@ -9,6 +9,66 @@
>
> #ifdef __NR_userfaultfd
>
> +/* The unit test doesn't need a large or random size, make it 32MB for now */
> +#define UFFD_TEST_MEM_SIZE (32UL << 20)
> +
> +#define MEM_ANON BIT_ULL(0)
> +#define MEM_SHMEM BIT_ULL(1)
> +#define MEM_SHMEM_PRIVATE BIT_ULL(2)
> +#define MEM_HUGETLB BIT_ULL(3)
> +#define MEM_HUGETLB_PRIVATE BIT_ULL(4)
> +
> +struct mem_type {
> + const char *name;
> + unsigned int mem_flag;
> + uffd_test_ops_t *mem_ops;
> + bool shared;
> +};
> +typedef struct mem_type mem_type_t;
> +
> +mem_type_t mem_types[] = {
> + {
> + .name = "anon",
> + .mem_flag = MEM_ANON,
> + .mem_ops = &anon_uffd_test_ops,
> + .shared = false,
> + },
> + {
> + .name = "shmem",
> + .mem_flag = MEM_SHMEM,
> + .mem_ops = &shmem_uffd_test_ops,
> + .shared = true,
> + },
> + {
> + .name = "shmem-private",
> + .mem_flag = MEM_SHMEM_PRIVATE,
> + .mem_ops = &shmem_uffd_test_ops,
> + .shared = false,
> + },
> + {
> + .name = "hugetlb",
> + .mem_flag = MEM_HUGETLB,
> + .mem_ops = &hugetlb_uffd_test_ops,
> + .shared = true,
> + },
> + {
> + .name = "hugetlb-private",
> + .mem_flag = MEM_HUGETLB_PRIVATE,
> + .mem_ops = &hugetlb_uffd_test_ops,
> + .shared = false,
> + },
> +};
> +
> +/* Returns: UFFD_TEST_* */
> +typedef void (*uffd_test_fn)(void);
> +
> +typedef struct {
> + const char *name;
> + uffd_test_fn uffd_fn;
> + unsigned int mem_targets;
> + uint64_t uffd_feature_required;
> +} uffd_test_case_t;
> +
> struct {
> unsigned int pass, skip, fail, total;
> } uffd_test_acct;
> @@ -108,9 +168,50 @@ static int test_uffd_api(bool use_dev)
> return 1;
> }
>
> +/*
> + * This function initializes the global variables. TODO: remove global
> + * vars and then remove this.
> + */
> +static int uffd_setup_environment(uffd_test_case_t *test, mem_type_t *mem_type)
> +{
> + map_shared = mem_type->shared;
> + uffd_test_ops = mem_type->mem_ops;
> +
> + if (mem_type->mem_flag & (MEM_HUGETLB_PRIVATE | MEM_HUGETLB))
> + page_size = default_huge_page_size();
> + else
> + page_size = psize();
> +
> + nr_pages = UFFD_TEST_MEM_SIZE / page_size;
> + /* TODO: remove this global var.. it's so ugly */
> + nr_cpus = 1;
> +
> + return uffd_test_ctx_init(test->uffd_feature_required);
> +}
> +
> +static bool uffd_feature_supported(uffd_test_case_t *test)
> +{
> + uint64_t features;
> +
> + if (uffd_get_features(&features))
> + return false;
> +
> + return (features & test->uffd_feature_required) ==
> + test->uffd_feature_required;
> +}
> +
> +uffd_test_case_t uffd_tests[] = {
> +};
> +
> int main(int argc, char *argv[])
> {
> + int n_tests = sizeof(uffd_tests) / sizeof(uffd_test_case_t);
> + int n_mems = sizeof(mem_types) / sizeof(mem_type_t);
> + uffd_test_case_t *test;
> + mem_type_t *mem_type;
> + char test_name[128];
> int has_uffd;
> + int i, j;
>
> has_uffd = test_uffd_api(false);
> has_uffd |= test_uffd_api(true);
> @@ -119,7 +220,31 @@ int main(int argc, char *argv[])
> printf("Userfaultfd not supported or unprivileged, skip all tests\n");
> exit(KSFT_SKIP);
> }
> +
> + for (i = 0; i < n_tests; i++) {
> + test = &uffd_tests[i];
> + for (j = 0; j < n_mems; j++) {
> + mem_type = &mem_types[j];
> + if (!(test->mem_targets & mem_type->mem_flag))
> + continue;
> + snprintf(test_name, sizeof(test_name),
> + "%s on %s", test->name, mem_type->name);
> +
> + uffd_test_start(test_name);
> + if (!uffd_feature_supported(test)) {
> + uffd_test_skip("feature missing");
> + continue;
> + }
> + if (uffd_setup_environment(test, mem_type)) {
> + uffd_test_skip("memory allocation failed");
Maybe uffd_test_skip("environment setup failed")?
> + continue;
> + }
> + test->uffd_fn();
> + }
> + }
> +
> uffd_test_report();
> +
> return uffd_test_acct.fail ? KSFT_FAIL : KSFT_PASS;
> }
>
> diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c
> index 62fcf039d6b7..dad1f62a7ecd 100644
> --- a/tools/testing/selftests/mm/vm_util.c
> +++ b/tools/testing/selftests/mm/vm_util.c
> @@ -264,3 +264,30 @@ int uffd_open(unsigned int 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 a67db8432855..2edad3256271 100644
> --- a/tools/testing/selftests/mm/vm_util.h
> +++ b/tools/testing/selftests/mm/vm_util.h
> @@ -51,6 +51,7 @@ int uffd_open(unsigned int flags);
> 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_get_features(uint64_t *features);
>
> /*
> * On ppc64 this will only work with radix 2M hugepage size
> --
> 2.39.1
>
--
Sincerely yours,
Mike.
next prev parent reply other threads:[~2023-04-11 11:10 UTC|newest]
Thread overview: 97+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-30 15:56 [PATCH 00/29] selftests/mm: Split / Refactor userfault test Peter Xu
2023-03-30 15:56 ` [PATCH 01/29] Revert "userfaultfd: don't fail on unrecognized features" Peter Xu
2023-03-30 18:31 ` David Hildenbrand
2023-03-30 22:22 ` Peter Xu
2023-03-30 19:04 ` Axel Rasmussen
2023-03-30 22:27 ` Peter Xu
2023-03-31 16:52 ` Axel Rasmussen
2023-03-31 18:08 ` Dmitry Safonov
2023-03-31 20:04 ` Axel Rasmussen
2023-04-03 7:48 ` David Hildenbrand
2023-03-30 16:06 ` [PATCH 02/29] selftests/mm: Update .gitignore with two missing tests Peter Xu
2023-04-03 7:48 ` David Hildenbrand
2023-04-07 9:09 ` Mike Rapoport
2023-03-30 16:06 ` [PATCH 03/29] selftests/mm: Dump a summary in run_vmtests.sh Peter Xu
2023-03-30 19:07 ` Axel Rasmussen
2023-03-30 22:28 ` Peter Xu
2023-04-03 7:49 ` David Hildenbrand
2023-04-07 9:15 ` Mike Rapoport
2023-03-30 16:06 ` [PATCH 04/29] selftests/mm: Merge util.h into vm_util.h Peter Xu
2023-03-30 19:14 ` Axel Rasmussen
2023-04-03 7:50 ` David Hildenbrand
2023-04-07 9:18 ` Mike Rapoport
2023-03-30 16:06 ` [PATCH 05/29] selftests/mm: Use TEST_GEN_PROGS where proper Peter Xu
2023-04-03 7:52 ` David Hildenbrand
2023-04-07 9:22 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 06/29] selftests/mm: Link vm_util.c always Peter Xu
2023-04-03 7:52 ` David Hildenbrand
2023-04-07 9:23 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 07/29] selftests/mm: Merge default_huge_page_size() into one Peter Xu
2023-03-30 20:30 ` Axel Rasmussen
2023-03-31 18:15 ` Mike Kravetz
2023-04-03 15:16 ` Peter Xu
2023-04-03 7:53 ` David Hildenbrand
2023-04-07 9:24 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 08/29] selftests/mm: Use PM_* macros in vm_utils.h Peter Xu
2023-03-31 18:24 ` Mike Kravetz
2023-04-03 7:53 ` David Hildenbrand
2023-04-07 9:28 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 09/29] selftests/mm: Reuse pagemap_get_entry() in vm_util.h Peter Xu
2023-03-30 21:08 ` Axel Rasmussen
2023-03-31 18:27 ` Mike Kravetz
2023-04-03 7:54 ` David Hildenbrand
2023-04-07 9:32 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 10/29] selftests/mm: Test UFFDIO_ZEROPAGE only when !hugetlb Peter Xu
2023-03-31 18:37 ` Mike Kravetz
2023-04-01 1:57 ` Axel Rasmussen
2023-04-03 7:55 ` David Hildenbrand
2023-04-03 16:10 ` Peter Xu
2023-04-07 9:42 ` Mike Rapoport
2023-04-11 19:03 ` Peter Xu
2023-03-30 16:07 ` [PATCH 11/29] selftests/mm: Drop test_uffdio_zeropage_eexist Peter Xu
2023-04-01 0:03 ` Mike Kravetz
2023-04-03 16:16 ` Peter Xu
2023-04-03 7:56 ` David Hildenbrand
2023-04-07 9:48 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 12/29] selftests/mm: Create uffd-common.[ch] Peter Xu
2023-04-07 10:10 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 13/29] selftests/mm: Split uffd tests into uffd-stress and uffd-unit-tests Peter Xu
2023-04-07 11:02 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 14/29] selftests/mm: uffd_[un]register() Peter Xu
2023-04-05 19:12 ` Peter Xu
2023-04-07 11:08 ` Mike Rapoport
2023-04-11 19:13 ` Peter Xu
2023-04-12 16:42 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 15/29] selftests/mm: uffd_open_{dev|sys}() Peter Xu
2023-04-03 8:00 ` David Hildenbrand
2023-04-07 11:11 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 16/29] selftests/mm: UFFDIO_API test Peter Xu
2023-04-03 7:59 ` David Hildenbrand
2023-04-03 16:43 ` Peter Xu
2023-04-03 19:06 ` David Hildenbrand
2023-04-03 20:24 ` Peter Xu
2023-04-04 12:48 ` David Hildenbrand
2023-04-05 16:21 ` Peter Xu
2023-03-30 16:08 ` [PATCH 17/29] selftests/mm: Drop global mem_fd in uffd tests Peter Xu
2023-04-11 10:39 ` Mike Rapoport
2023-03-30 16:08 ` [PATCH 18/29] selftests/mm: Drop global hpage_size " Peter Xu
2023-04-11 10:41 ` Mike Rapoport
2023-03-30 16:08 ` [PATCH 19/29] selftests/mm: Let uffd_handle_page_fault() takes wp parameter Peter Xu
2023-04-11 10:52 ` Mike Rapoport
2023-04-11 19:36 ` Peter Xu
2023-03-30 16:08 ` [PATCH 20/29] selftests/mm: Allow allocate_area() to fail properly Peter Xu
2023-04-11 11:02 ` Mike Rapoport
2023-04-11 19:42 ` Peter Xu
2023-03-30 16:08 ` [PATCH 21/29] selftests/mm: Add framework for uffd-unit-test Peter Xu
2023-04-11 11:09 ` Mike Rapoport [this message]
2023-04-11 20:09 ` Peter Xu
2023-03-30 16:08 ` [PATCH 22/29] selftests/mm: Move uffd pagemap test to unit test Peter Xu
2023-04-11 12:41 ` Mike Rapoport
2023-03-30 16:08 ` [PATCH 23/29] selftests/mm: Move uffd minor " Peter Xu
2023-03-30 16:08 ` [PATCH 24/29] selftests/mm: Move uffd sig/events tests into uffd unit tests Peter Xu
2023-03-30 16:08 ` [PATCH 25/29] selftests/mm: Move zeropage test " Peter Xu
2023-03-30 16:08 ` [PATCH 26/29] selftests/mm: Workaround no way to detect uffd-minor + wp Peter Xu
2023-03-30 16:08 ` [PATCH 27/29] selftests/mm: Allow uffd test to skip properly with no privilege Peter Xu
2023-03-30 16:08 ` [PATCH 28/29] selftests/mm: Drop sys/dev test in uffd-stress test Peter Xu
2023-03-30 16:08 ` [PATCH 29/29] selftests/mm: Add shmem-private test to uffd-stress Peter Xu
2023-03-31 16:47 ` [PATCH 00/29] selftests/mm: Split / Refactor userfault test Peter Xu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZDU//1RXYUMIRMk3@linux.ibm.com \
--to=rppt@linux.ibm.com \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=axelrasmussen@google.com \
--cc=david@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lsoaresp@redhat.com \
--cc=mike.kravetz@oracle.com \
--cc=nadav.amit@gmail.com \
--cc=peterx@redhat.com \
--cc=rppt@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.