userfaultfd/selftests: exercise minor fault handling shmem support
Enable test_uffdio_minor for test_type == TEST_SHMEM, and modify the test slightly to pass in / check for the right feature flags. Link: https://lkml.kernel.org/r/20210503180737.2487560-11-axelrasmussen@google.com Signed-off-by: Axel Rasmussen <axelrasmussen@google.com> Reviewed-by: Peter Xu <peterx@redhat.com> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Brian Geffon <bgeffon@google.com> Cc: "Dr . David Alan Gilbert" <dgilbert@redhat.com> Cc: Hugh Dickins <hughd@google.com> Cc: Jerome Glisse <jglisse@redhat.com> Cc: Joe Perches <joe@perches.com> Cc: Kirill A. Shutemov <kirill@shutemov.name> Cc: Lokesh Gidra <lokeshgidra@google.com> Cc: Mike Kravetz <mike.kravetz@oracle.com> Cc: Mike Rapoport <rppt@linux.vnet.ibm.com> Cc: Mina Almasry <almasrymina@google.com> Cc: Oliver Upton <oupton@google.com> Cc: Shaohua Li <shli@fb.com> Cc: Shuah Khan <shuah@kernel.org> Cc: Stephen Rothwell <sfr@canb.auug.org.au> Cc: Wang Qing <wangqing@vivo.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
8ba6e86408
commit
4a8f021ba0
@ -474,6 +474,7 @@ static void wp_range(int ufd, __u64 start, __u64 len, bool wp)
|
||||
static void continue_range(int ufd, __u64 start, __u64 len)
|
||||
{
|
||||
struct uffdio_continue req;
|
||||
int ret;
|
||||
|
||||
req.range.start = start;
|
||||
req.range.len = len;
|
||||
@ -482,6 +483,17 @@ static void continue_range(int ufd, __u64 start, __u64 len)
|
||||
if (ioctl(ufd, UFFDIO_CONTINUE, &req))
|
||||
err("UFFDIO_CONTINUE failed for address 0x%" PRIx64,
|
||||
(uint64_t)start);
|
||||
|
||||
/*
|
||||
* Error handling within the kernel for continue is subtly different
|
||||
* from copy or zeropage, so it may be a source of bugs. Trigger an
|
||||
* error (-EEXIST) on purpose, to verify doing so doesn't cause a BUG.
|
||||
*/
|
||||
req.mapped = 0;
|
||||
ret = ioctl(ufd, UFFDIO_CONTINUE, &req);
|
||||
if (ret >= 0 || req.mapped != -EEXIST)
|
||||
err("failed to exercise UFFDIO_CONTINUE error handling, ret=%d, mapped=%" PRId64,
|
||||
ret, (int64_t) req.mapped);
|
||||
}
|
||||
|
||||
static void *locking_thread(void *arg)
|
||||
@ -1182,7 +1194,7 @@ static int userfaultfd_minor_test(void)
|
||||
void *expected_page;
|
||||
char c;
|
||||
struct uffd_stats stats = { 0 };
|
||||
uint64_t features = UFFD_FEATURE_MINOR_HUGETLBFS;
|
||||
uint64_t req_features, features_out;
|
||||
|
||||
if (!test_uffdio_minor)
|
||||
return 0;
|
||||
@ -1190,9 +1202,17 @@ static int userfaultfd_minor_test(void)
|
||||
printf("testing minor faults: ");
|
||||
fflush(stdout);
|
||||
|
||||
uffd_test_ctx_init_ext(&features);
|
||||
/* If kernel reports the feature isn't supported, skip the test. */
|
||||
if (!(features & UFFD_FEATURE_MINOR_HUGETLBFS)) {
|
||||
if (test_type == TEST_HUGETLB)
|
||||
req_features = UFFD_FEATURE_MINOR_HUGETLBFS;
|
||||
else if (test_type == TEST_SHMEM)
|
||||
req_features = UFFD_FEATURE_MINOR_SHMEM;
|
||||
else
|
||||
return 1;
|
||||
|
||||
features_out = req_features;
|
||||
uffd_test_ctx_init_ext(&features_out);
|
||||
/* If kernel reports required features aren't supported, skip test. */
|
||||
if ((features_out & req_features) != req_features) {
|
||||
printf("skipping test due to lack of feature support\n");
|
||||
fflush(stdout);
|
||||
return 0;
|
||||
@ -1575,6 +1595,7 @@ static void set_test_type(const char *type)
|
||||
map_shared = true;
|
||||
test_type = TEST_SHMEM;
|
||||
uffd_test_ops = &shmem_uffd_test_ops;
|
||||
test_uffdio_minor = true;
|
||||
} else {
|
||||
err("Unknown test type: %s", type);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user