selftests/mm: add separate UFFDIO_MOVE test for PMD splitting
authorSuren Baghdasaryan <surenb@google.com>
Sat, 30 Dec 2023 02:56:36 +0000 (18:56 -0800)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 5 Jan 2024 18:17:49 +0000 (10:17 -0800)
Add a test for UFFDIO_MOVE ioctl operating on a hugepage which has to be
split because destination is marked with MADV_NOHUGEPAGE.  With this we
cover all 3 cases: normal page move, hugepage move, hugepage splitting
before move.

Link: https://lkml.kernel.org/r/20231230025636.2477429-1-surenb@google.com
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Axel Rasmussen <axelrasmussen@google.com>
Cc: Brian Geffon <bgeffon@google.com>
Cc: Christian Brauner <brauner@kernel.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Jann Horn <jannh@google.com>
Cc: Kalesh Singh <kaleshsingh@google.com>
Cc: Liam R. Howlett <Liam.Howlett@oracle.com>
Cc: Lokesh Gidra <lokeshgidra@google.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mike Rapoport (IBM) <rppt@kernel.org>
Cc: Nicolas Geoffray <ngeoffray@google.com>
Cc: Peter Xu <peterx@redhat.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Shuah Khan <shuah@kernel.org>
Cc: ZhangPeng <zhangpeng362@huawei.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
tools/testing/selftests/mm/uffd-unit-tests.c

index d8091523c2dfef4ef2f10bb121853aa4d4f0ddd2..cce90a10515ad2fe78fe68147d26732d717c3bb6 100644 (file)
@@ -1199,6 +1199,16 @@ static void uffd_move_test(uffd_test_args_t *targs)
 
 static void uffd_move_pmd_test(uffd_test_args_t *targs)
 {
+       if (madvise(area_dst, nr_pages * page_size, MADV_HUGEPAGE))
+               err("madvise(MADV_HUGEPAGE) failure");
+       uffd_move_test_common(targs, read_pmd_pagesize(),
+                             uffd_move_pmd_handle_fault);
+}
+
+static void uffd_move_pmd_split_test(uffd_test_args_t *targs)
+{
+       if (madvise(area_dst, nr_pages * page_size, MADV_NOHUGEPAGE))
+               err("madvise(MADV_NOHUGEPAGE) failure");
        uffd_move_test_common(targs, read_pmd_pagesize(),
                              uffd_move_pmd_handle_fault);
 }
@@ -1330,6 +1340,13 @@ uffd_test_case_t uffd_tests[] = {
                .uffd_feature_required = UFFD_FEATURE_MOVE,
                .test_case_ops = &uffd_move_test_pmd_case_ops,
        },
+       {
+               .name = "move-pmd-split",
+               .uffd_fn = uffd_move_pmd_split_test,
+               .mem_targets = MEM_ANON,
+               .uffd_feature_required = UFFD_FEATURE_MOVE,
+               .test_case_ops = &uffd_move_test_pmd_case_ops,
+       },
        {
                .name = "wp-fork",
                .uffd_fn = uffd_wp_fork_test,