BACKPORT: selftests/mm: call uffd_test_ctx_clear at the end of the test

uffd_test_ctx_clear() is being called from uffd_test_ctx_init() to unmap
areas used in the previous test run.  This approach is problematic because
while unmapping areas uffd_test_ctx_clear() uses page_size and nr_pages
which might differ from one test run to another.  Fix this by calling
uffd_test_ctx_clear() after each test is done.

Link: https://lkml.kernel.org/r/20231206103702.3873743-4-surenb@google.com
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Axel Rasmussen <axelrasmussen@google.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Andrea Arcangeli <aarcange@redhat.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: 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 1c8d39fa7b63dcbb77af7b0325fdc519c35fe618)
Conflicts:
	tools/testing/selftests/mm/uffd-common.c
	tools/testing/selftests/mm/uffd-common.h
	tools/testing/selftests/mm/uffd-stress.c
	tools/testing/selftests/mm/uffd-unit-tests.c
	tools/testing/selftests/vm/userfaultfd.c

1. Userfaultfd selftest was split into separate files and as a consequence
   the code moved from selftests/vm/userfaultfd.c to selftests/mm/uffd_* files.

Bug: 274911254
Change-Id: Ic224c3965a645342dc0f41e743d3c072b7bb852e
Signed-off-by: Lokesh Gidra <lokeshgidra@google.com>
This commit is contained in:
Suren Baghdasaryan
2023-12-06 02:36:57 -08:00
committed by Lokesh Gidra
parent abd6748ba6
commit ee72d5a7d9

View File

@@ -517,8 +517,6 @@ static void uffd_test_ctx_init(uint64_t features)
{
unsigned long nr, cpu;
uffd_test_ctx_clear();
uffd_test_ops->allocate_area((void **)&area_src, true);
uffd_test_ops->allocate_area((void **)&area_dst, false);
@@ -1195,6 +1193,7 @@ static int userfaultfd_zeropage_test(void)
if (my_bcmp(area_dst, zeropage, page_size))
err("zeropage is not zero");
uffd_test_ctx_clear();
printf("done.\n");
return 0;
}
@@ -1207,6 +1206,7 @@ static int userfaultfd_events_test(void)
pid_t pid;
char c;
struct uffd_stats stats = { 0 };
int ret;
printf("testing events (fork, remap, remove): ");
fflush(stdout);
@@ -1243,12 +1243,16 @@ static int userfaultfd_events_test(void)
err("faulting process failed");
if (write(pipefd[1], &c, sizeof(c)) != sizeof(c))
err("pipe write");
ret = 1;
if (pthread_join(uffd_mon, NULL))
return 1;
goto out;
uffd_stats_report(&stats, 1);
return stats.missing_faults != nr_pages;
ret = stats.missing_faults != nr_pages;
out:
uffd_test_ctx_clear();
return ret;
}
static int userfaultfd_sig_test(void)
@@ -1260,6 +1264,7 @@ static int userfaultfd_sig_test(void)
pid_t pid;
char c;
struct uffd_stats stats = { 0 };
int ret;
printf("testing signal delivery: ");
fflush(stdout);
@@ -1300,14 +1305,18 @@ static int userfaultfd_sig_test(void)
err("faulting process failed");
if (write(pipefd[1], &c, sizeof(c)) != sizeof(c))
err("pipe write");
ret = 1;
if (pthread_join(uffd_mon, (void **)&userfaults))
return 1;
goto out;
printf("done.\n");
if (userfaults)
err("Signal test failed, userfaults: %ld", userfaults);
return userfaults != 0;
ret = userfaults != 0;
out:
uffd_test_ctx_clear();
return ret;
}
void check_memory_contents(char *p)
@@ -1336,6 +1345,7 @@ static int userfaultfd_minor_test(void)
pthread_t uffd_mon;
char c;
struct uffd_stats stats = { 0 };
int ret;
if (!test_uffdio_minor)
return 0;
@@ -1376,8 +1386,9 @@ static int userfaultfd_minor_test(void)
if (write(pipefd[1], &c, sizeof(c)) != sizeof(c))
err("pipe write");
ret = 1;
if (pthread_join(uffd_mon, NULL))
return 1;
goto out;
uffd_stats_report(&stats, 1);
@@ -1398,7 +1409,10 @@ static int userfaultfd_minor_test(void)
printf(" done.\n");
}
return stats.missing_faults != 0 || stats.minor_faults != nr_pages;
ret = stats.missing_faults != 0 || stats.minor_faults != nr_pages;
out:
uffd_test_ctx_clear();
return ret;
}
#define BIT_ULL(nr) (1ULL << (nr))
@@ -1532,6 +1546,7 @@ static void userfaultfd_pagemap_test(unsigned int test_pgsize)
pagemap_check_wp(value, false);
close(pagemap_fd);
uffd_test_ctx_clear();
printf("done\n");
}
@@ -1621,8 +1636,10 @@ static int userfaultfd_stress(void)
uffd_stats_reset(uffd_stats, nr_cpus);
/* bounce pass */
if (stress(uffd_stats))
if (stress(uffd_stats)) {
uffd_test_ctx_clear();
return 1;
}
/* Clear all the write protections if there is any */
if (test_uffdio_wp)
@@ -1654,6 +1671,7 @@ static int userfaultfd_stress(void)
uffd_stats_report(uffd_stats, nr_cpus);
}
uffd_test_ctx_clear();
if (test_type == TEST_ANON) {
/*