From 51eab7ecc4e9ef7628b098ed69ad63aa4c4b6e1b Mon Sep 17 00:00:00 2001 From: Suren Baghdasaryan Date: Fri, 29 Dec 2023 18:56:36 -0800 Subject: [PATCH] BACKPORT: selftests/mm: add separate UFFDIO_MOVE test for PMD splitting 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 Cc: Al Viro Cc: Andrea Arcangeli Cc: Axel Rasmussen Cc: Brian Geffon Cc: Christian Brauner Cc: David Hildenbrand Cc: Hugh Dickins Cc: Jann Horn Cc: Kalesh Singh Cc: Liam R. Howlett Cc: Lokesh Gidra Cc: Matthew Wilcox (Oracle) Cc: Michal Hocko Cc: Mike Rapoport (IBM) Cc: Nicolas Geoffray Cc: Peter Xu Cc: Ryan Roberts Cc: Shuah Khan Cc: ZhangPeng Signed-off-by: Andrew Morton (cherry picked from commit a5b7620bab81f16e8bbb04f4aea94c4c7feb0d77) Conflicts: tools/testing/selftests/mm/uffd-unit-tests.c tools/testing/selftests/vm/userfaultfd.c 1. Add request_src_hugepages() to enable THP on src 2. Add madvise() to enable THP on dst in request_hugepages() 3. Add request_split_hugepages() to enable THP on src and disable on dst 4. Change return type of uffd_move_pmd_split_test() to int Bug: 274911254 Change-Id: I21147a5b7f3e8bbe2befa8bff536e62826e9f6e3 Signed-off-by: Lokesh Gidra --- tools/testing/selftests/vm/userfaultfd.c | 31 ++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selftests/vm/userfaultfd.c index 0e200472d82c..4f3f0f7fe55e 100644 --- a/tools/testing/selftests/vm/userfaultfd.c +++ b/tools/testing/selftests/vm/userfaultfd.c @@ -1255,7 +1255,7 @@ static void prevent_hugepages() } } -static void request_hugepages() +static void request_src_hugepages() { /* This should be done before source area is populated */ if (madvise(area_src, nr_pages * page_size, MADV_HUGEPAGE)) { @@ -1266,6 +1266,20 @@ static void request_hugepages() } } +static void request_hugepages() +{ + request_src_hugepages(); + if (madvise(area_dst, nr_pages * page_size, MADV_HUGEPAGE)) + err("madvise(MADV_HUGEPAGE) failure"); +} + +static void request_split_hugepages() +{ + request_src_hugepages(); + if (madvise(area_dst, nr_pages * page_size, MADV_NOHUGEPAGE)) + err("madvise(MADV_NOHUGEPAGE) failure"); +} + struct uffd_test_case_ops uffd_move_test_case_ops = { .post_alloc = prevent_hugepages, }; @@ -1274,6 +1288,10 @@ struct uffd_test_case_ops uffd_move_test_pmd_case_ops = { .post_alloc = request_hugepages, }; +struct uffd_test_case_ops uffd_move_test_pmd_split_case_ops = { + .post_alloc = request_split_hugepages, +}; + static void uffd_move_handle_fault_common(struct uffd_msg *msg, struct uffd_stats *args, unsigned long len) @@ -1420,6 +1438,14 @@ static int uffd_move_pmd_test(void) uffd_move_pmd_handle_fault); } +static int uffd_move_pmd_split_test(void) +{ + printf("move-pmd-split "); + return uffd_move_test_common(&uffd_move_test_pmd_split_case_ops, + read_pmd_pagesize(), + uffd_move_pmd_handle_fault); +} + static int userfaultfd_move_test(void) { int ret; @@ -1430,7 +1456,8 @@ static int userfaultfd_move_test(void) printf("testing UFFDIO_MOVE: "); fflush(stdout); - ret = uffd_move_test() || uffd_move_pmd_test(); + ret = uffd_move_test() || uffd_move_pmd_test() + || uffd_move_pmd_split_test(); printf("done.\n"); return ret;