selftests/mm: refactor uffd_poll_thread to allow custom fault handlers
authorAxel Rasmussen <axelrasmussen@google.com>
Fri, 7 Jul 2023 21:55:39 +0000 (14:55 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 18 Aug 2023 17:12:17 +0000 (10:12 -0700)
Previously, we had "one fault handler to rule them all", which used
several branches to deal with all of the scenarios required by all of the
various tests.

In upcoming patches, I plan to add a new test, which has its own slightly
different fault handling logic.  Instead of continuing to add cruft to the
existing fault handler, let's allow tests to define custom ones, separate
from other tests.

Link: https://lkml.kernel.org/r/20230707215540.2324998-8-axelrasmussen@google.com
Signed-off-by: Axel Rasmussen <axelrasmussen@google.com>
Acked-by: Peter Xu <peterx@redhat.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Brian Geffon <bgeffon@google.com>
Cc: Christian Brauner <brauner@kernel.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Gaosheng Cui <cuigaosheng1@huawei.com>
Cc: Huang, Ying <ying.huang@intel.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: James Houghton <jthoughton@google.com>
Cc: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
Cc: Jiaqi Yan <jiaqiyan@google.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
Cc: Liam R. Howlett <Liam.Howlett@oracle.com>
Cc: Miaohe Lin <linmiaohe@huawei.com>
Cc: Mike Kravetz <mike.kravetz@oracle.com>
Cc: Mike Rapoport (IBM) <rppt@kernel.org>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Nadav Amit <namit@vmware.com>
Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Suleiman Souhlal <suleiman@google.com>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: T.J. Alumbaugh <talumbau@google.com>
Cc: Yu Zhao <yuzhao@google.com>
Cc: ZhangPeng <zhangpeng362@huawei.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
tools/testing/selftests/mm/uffd-common.c
tools/testing/selftests/mm/uffd-common.h
tools/testing/selftests/mm/uffd-stress.c

index ba20d75040226117d74d9205bfe6658f3d9505ba..02b89860e193d8f3efe524f4fec0111891892bf0 100644 (file)
@@ -499,6 +499,9 @@ void *uffd_poll_thread(void *arg)
        int ret;
        char tmp_chr;
 
+       if (!args->handle_fault)
+               args->handle_fault = uffd_handle_page_fault;
+
        pollfd[0].fd = uffd;
        pollfd[0].events = POLLIN;
        pollfd[1].fd = pipefd[cpu*2];
@@ -527,7 +530,7 @@ void *uffd_poll_thread(void *arg)
                        err("unexpected msg event %u\n", msg.event);
                        break;
                case UFFD_EVENT_PAGEFAULT:
-                       uffd_handle_page_fault(&msg, args);
+                       args->handle_fault(&msg, args);
                        break;
                case UFFD_EVENT_FORK:
                        close(uffd);
index 197f5262fe0d179ed805e9933692554b0a7a6871..7c4fa964c3b088782985fe249139dbb6263b83f1 100644 (file)
@@ -77,6 +77,9 @@ struct uffd_args {
        unsigned long missing_faults;
        unsigned long wp_faults;
        unsigned long minor_faults;
+
+       /* A custom fault handler; defaults to uffd_handle_page_fault. */
+       void (*handle_fault)(struct uffd_msg *msg, struct uffd_args *args);
 };
 
 struct uffd_test_ops {
index 995ff13e74c7804588f9a59fde51f9a17a4526d9..73ebb97c70264ac36d1bbf6c7ab98acb27e3b776 100644 (file)
@@ -189,10 +189,8 @@ static int stress(struct uffd_args *args)
                                   locking_thread, (void *)cpu))
                        return 1;
                if (bounces & BOUNCE_POLL) {
-                       if (pthread_create(&uffd_threads[cpu], &attr,
-                                          uffd_poll_thread,
-                                          (void *)&args[cpu]))
-                               return 1;
+                       if (pthread_create(&uffd_threads[cpu], &attr, uffd_poll_thread, &args[cpu]))
+                               err("uffd_poll_thread create");
                } else {
                        if (pthread_create(&uffd_threads[cpu], &attr,
                                           uffd_read_thread,
@@ -250,6 +248,8 @@ static int userfaultfd_stress(void)
        struct uffd_args args[nr_cpus];
        uint64_t mem_size = nr_pages * page_size;
 
+       memset(args, 0, sizeof(struct uffd_args) * nr_cpus);
+
        if (uffd_test_ctx_init(UFFD_FEATURE_WP_UNPOPULATED, NULL))
                err("context init failed");