• Home
  • Raw
  • Download

Lines Matching +full:no +full:- +full:wp

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2015-2023 Red Hat, Inc.
8 #include "uffd-common.h"
48 .name = "shmem-private",
60 .name = "hugetlb-private",
186 map_shared = mem_type->shared; in uffd_setup_environment()
187 uffd_test_ops = mem_type->mem_ops; in uffd_setup_environment()
189 if (mem_type->mem_flag & (MEM_HUGETLB_PRIVATE | MEM_HUGETLB)) in uffd_setup_environment()
199 args->mem_type = mem_type; in uffd_setup_environment()
201 return uffd_test_ctx_init(test->uffd_feature_required, errmsg); in uffd_setup_environment()
211 return (features & test->uffd_feature_required) == in uffd_feature_supported()
212 test->uffd_feature_required; in uffd_feature_supported()
226 #define pagemap_check_wp(value, wp) do { \ argument
227 if (!!(value & PM_UFFD_WP) != wp) \
228 err("pagemap uffd-wp bit error: 0x%"PRIx64, value); \
241 while (uffd_read_msg(args->parent_uffd, &msg)); in fork_event_consumer()
247 args->child_uffd = msg.arg.fork.ufd; in fork_event_consumer()
267 /* Read-only pins */ in pin_pages()
271 if (args->pinned) in pin_pages()
274 args->gup_fd = open("/sys/kernel/debug/gup_test", O_RDWR); in pin_pages()
275 if (args->gup_fd < 0) in pin_pages()
276 return -errno; in pin_pages()
278 if (ioctl(args->gup_fd, PIN_LONGTERM_TEST_START, &test)) { in pin_pages()
280 close(args->gup_fd); in pin_pages()
281 return -errno; in pin_pages()
283 args->pinned = true; in pin_pages()
289 if (!args->pinned) in unpin_pages()
291 if (ioctl(args->gup_fd, PIN_LONGTERM_TEST_STOP)) in unpin_pages()
293 close(args->gup_fd); in unpin_pages()
294 args->pinned = false; in unpin_pages()
299 fork_event_args args = { .parent_uffd = uffd, .child_uffd = -1 }; in pagemap_test_fork()
327 * After fork(), we should handle uffd-wp bit differently: in pagemap_test_fork()
387 /* Test read-zero-page upon pte marker */ in uffd_wp_unpopulated_test()
415 uffd_test_fail("Detected %s uffd-wp bit in child in present pte", in uffd_wp_fork_test_common()
431 if (args->mem_type->shared) { in uffd_wp_fork_test_common()
436 * NOTE: ignore retval because private-hugetlb doesn't yet in uffd_wp_fork_test_common()
442 /* Uffd-wp should persist even swapped out */ in uffd_wp_fork_test_common()
446 uffd_test_fail("Detected %s uffd-wp bit in child in zapped pte", in uffd_wp_fork_test_common()
505 uffd_test_fail("Detected %s uffd-wp bit in early CoW of fork()", in uffd_wp_fork_pin_test_common()
518 uffd_test_fail("Detected %s uffd-wp bit when RO pin", in uffd_wp_fork_pin_test_common()
545 expected_byte = ~((uint8_t)(i % ((uint8_t)-1))); in check_memory_contents()
562 * NOTE: MADV_COLLAPSE is not yet compatible with WP, so testing in uffd_minor_test_common()
568 /* NOTE! MADV_COLLAPSE may not work with uffd-wp */ in uffd_minor_test_common()
573 * After registering with UFFD, populate the non-UFFD-registered side of in uffd_minor_test_common()
577 memset(area_dst + (p * page_size), p % ((uint8_t)-1), in uffd_minor_test_common()
585 * Read each of the pages back using the UFFD-registered mapping. We in uffd_minor_test_common()
587 * fault. uffd_poll_thread will resolve the fault by bit-flipping the in uffd_minor_test_common()
605 uffd_test_ops->check_pmd_mapping(area_dst, in uffd_minor_test_common()
609 * This won't cause uffd-fault - it purely just makes sure there in uffd_minor_test_common()
610 * was no corruption. in uffd_minor_test_common()
648 * For non-cooperative userfaultfd test we fork() a process that will
663 * test robustness use case - we release monitored area, fork a process
666 * feature. Using monitor thread, verify no userfault events are generated.
668 static int faulting_process(int signal_test, bool wp) in faulting_process() argument
686 lastnr = (unsigned long)-1; in faulting_process()
703 if (copy_page(uffd, offset, wp)) in faulting_process()
706 /* This is a WP request */ in faulting_process()
754 uffd_test_ops->release_pages(area_dst); in faulting_process()
764 static void uffd_sigbus_test_common(bool wp) in uffd_sigbus_test_common() argument
778 true, wp, false)) in uffd_sigbus_test_common()
781 if (faulting_process(1, wp)) in uffd_sigbus_test_common()
784 uffd_test_ops->release_pages(area_dst); in uffd_sigbus_test_common()
786 args.apply_wp = wp; in uffd_sigbus_test_common()
798 exit(faulting_process(2, wp)); in uffd_sigbus_test_common()
824 static void uffd_events_test_common(bool wp) in uffd_events_test_common() argument
836 true, wp, false)) in uffd_events_test_common()
839 args.apply_wp = wp; in uffd_events_test_common()
851 exit(faulting_process(0, wp)); in uffd_events_test_common()
880 uffd_test_ops->alias_mapping(&uffdio_zeropage->range.start, in retry_uffdio_zeropage()
881 uffdio_zeropage->range.len, in retry_uffdio_zeropage()
884 if (uffdio_zeropage->zeropage != -EEXIST) in retry_uffdio_zeropage()
886 (int64_t)uffdio_zeropage->zeropage); in retry_uffdio_zeropage()
889 (int64_t)uffdio_zeropage->zeropage); in retry_uffdio_zeropage()
908 else if (res != -EINVAL) in do_uffdio_zeropage()
909 err("UFFDIO_ZEROPAGE not -EINVAL"); in do_uffdio_zeropage()
953 err("data non-zero at offset %d\n", i); in uffd_zeropage_test()
1000 if (msg->event != UFFD_EVENT_PAGEFAULT) in uffd_poison_handle_fault()
1001 err("unexpected msg event %u", msg->event); in uffd_poison_handle_fault()
1003 if (msg->arg.pagefault.flags & in uffd_poison_handle_fault()
1005 err("unexpected fault type %llu", msg->arg.pagefault.flags); in uffd_poison_handle_fault()
1007 offset = (char *)(unsigned long)msg->arg.pagefault.address - area_dst; in uffd_poison_handle_fault()
1008 offset &= ~(page_size-1); in uffd_poison_handle_fault()
1010 /* Odd pages -> copy zeroed page; even pages -> poison. */ in uffd_poison_handle_fault()
1080 do_register_ioctls_test(uffd_test_args_t *args, bool miss, bool wp, bool minor) in do_register_ioctls_test() argument
1083 mem_type_t *mem_type = args->mem_type; in do_register_ioctls_test()
1087 miss, wp, minor, &ioctls); in do_register_ioctls_test()
1091 * just fail with -EINVAL first.. in do_register_ioctls_test()
1094 * Case 2: register with no mode selected in do_register_ioctls_test()
1096 if ((minor && (mem_type->mem_flag == MEM_ANON)) || in do_register_ioctls_test()
1097 (!miss && !wp && !minor)) { in do_register_ioctls_test()
1098 if (ret != -EINVAL) in do_register_ioctls_test()
1099 err("register (miss=%d, wp=%d, minor=%d) failed " in do_register_ioctls_test()
1100 "with wrong errno=%d", miss, wp, minor, ret); in do_register_ioctls_test()
1107 if (wp) in do_register_ioctls_test()
1114 "(miss=%d, wp=%d, minor=%d): expected=0x%"PRIx64", " in do_register_ioctls_test()
1115 "returned=0x%"PRIx64, miss, wp, minor, expected, ioctls); in do_register_ioctls_test()
1123 int miss, wp, minor; in uffd_register_ioctls_test() local
1126 for (wp = 0; wp <= 1; wp++) in uffd_register_ioctls_test()
1128 do_register_ioctls_test(args, miss, wp, minor); in uffd_register_ioctls_test()
1136 .name = "register-ioctls",
1153 .name = "wp-fork",
1160 .name = "wp-fork-with-event",
1165 /* when set, child process should inherit uffd-wp bits */
1169 .name = "wp-fork-pin",
1176 .name = "wp-fork-pin-with-event",
1181 /* when set, child process should inherit uffd-wp bits */
1185 .name = "wp-unpopulated",
1199 .name = "minor-wp",
1207 * minor mode supports wr-protect. There's no feature flag
1213 .name = "minor-collapse",
1228 .name = "sigbus-wp",
1243 .name = "events-wp",
1261 printf("usage: %s [-f TESTNAME]\n", prog); in usage()
1263 puts(" -f: test name to filter (e.g., event)"); in usage()
1264 puts(" -h: show the help msg"); in usage()
1265 puts(" -l: list tests only"); in usage()
1283 while ((opt = getopt(argc, argv, "f:hl")) != -1) { in main()
1311 if (test_filter && !strstr(test->name, test_filter)) in main()
1314 printf("%s\n", test->name); in main()
1319 if (!(test->mem_targets & mem_type->mem_flag)) in main()
1322 uffd_test_start("%s on %s", test->name, mem_type->name); in main()
1323 if ((mem_type->mem_flag == MEM_HUGETLB || in main()
1324 mem_type->mem_flag == MEM_HUGETLB_PRIVATE) && in main()
1338 test->uffd_fn(&args); in main()