diff options
author | Suren Baghdasaryan <surenb@google.com> | 2023-12-29 18:56:36 -0800 |
---|---|---|
committer | Lokesh Gidra <lokeshgidra@google.com> | 2024-04-22 18:09:14 +0000 |
commit | 51eab7ecc4e9ef7628b098ed69ad63aa4c4b6e1b (patch) | |
tree | c330905f6cdf5061dfd11c19a1c58d27fd5f9ffe | |
parent | f15269151532fdeb5ea43be483a3e97531399f47 (diff) | |
download | hikey-linaro-51eab7ecc4e9ef7628b098ed69ad63aa4c4b6e1b.tar.gz |
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 <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>
(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 <lokeshgidra@google.com>
-rw-r--r-- | tools/testing/selftests/vm/userfaultfd.c | 31 |
1 files 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; |