Lines Matching refs:uffd
8 #include "uffd-common.h"
67 /* Arguments to be passed over to each uffd unit test */
120 * return 1 even if some test failed as long as uffd supported, because in
121 * that case we still want to proceed with the rest uffd unit tests.
126 int uffd;
132 uffd = uffd_open_dev(UFFD_FLAGS);
134 uffd = uffd_open_sys(UFFD_FLAGS);
135 if (uffd < 0) {
143 if (ioctl(uffd, UFFDIO_API, &uffdio_api) == 0) {
151 if (ioctl(uffd, UFFDIO_API, &uffdio_api) == 0) {
159 if (ioctl(uffd, UFFDIO_API, &uffdio_api)) {
166 if (ioctl(uffd, UFFDIO_API, &uffdio_api) == 0) {
167 uffd_test_fail("UFFDIO_API should reject initialized uffd");
173 close(uffd);
174 /* We have a valid uffd handle */
228 err("pagemap uffd-wp bit error: 0x%"PRIx64, value); \
297 static int pagemap_test_fork(int uffd, bool with_event, bool test_pin)
299 fork_event_args args = { .parent_uffd = uffd, .child_uffd = -1 };
327 * After fork(), we should handle uffd-wp bit differently:
344 err("Didn't receive child uffd");
356 if (uffd_register(uffd, area_dst, nr_pages * page_size,
363 wp_range(uffd, (uint64_t)area_dst, page_size, true);
368 wp_range(uffd, (uint64_t)area_dst, page_size, false);
373 wp_range(uffd, (uint64_t)area_dst, page_size, true);
388 wp_range(uffd, (uint64_t)area_dst, page_size, true);
403 if (uffd_register(uffd, area_dst, nr_pages * page_size,
411 wp_range(uffd, (uint64_t)area_dst, page_size, true);
414 if (pagemap_test_fork(uffd, with_event, false)) {
415 uffd_test_fail("Detected %s uffd-wp bit in child in present pte",
445 if (pagemap_test_fork(uffd, with_event, false)) {
446 uffd_test_fail("Detected %s uffd-wp bit in child in zapped pte",
452 wp_range(uffd, (uint64_t)area_dst, page_size, false);
462 if (uffd_unregister(uffd, area_dst, nr_pages * page_size))
483 if (uffd_register(uffd, area_dst, page_size, false, true, false))
490 wp_range(uffd, (uint64_t)area_dst, page_size, true);
500 uffd_unregister(uffd, area_dst, page_size);
504 if (pagemap_test_fork(uffd, with_event, false)) {
505 uffd_test_fail("Detected %s uffd-wp bit in early CoW of fork()",
517 if (pagemap_test_fork(uffd, with_event, true)) {
518 uffd_test_fail("Detected %s uffd-wp bit when RO pin",
524 if (uffd_unregister(uffd, area_dst, page_size))
567 if (uffd_register(uffd, area_dst_alias, nr_pages * page_size,
568 /* NOTE! MADV_COLLAPSE may not work with uffd-wp */
609 * This won't cause uffd-fault - it purely just makes sure there
703 if (copy_page(uffd, offset, wp))
708 wp_range(uffd,
773 fcntl(uffd, F_SETFL, uffd_flags | O_NONBLOCK);
775 if (uffd_register(uffd, area_dst, nr_pages * page_size,
827 fcntl(uffd, F_SETFL, uffd_flags | O_NONBLOCK);
828 if (uffd_register(uffd, area_dst, nr_pages * page_size,
918 uffd_register_detect_zeropage(int uffd, void *addr, uint64_t len)
922 if (uffd_register_with_ioctls(uffd, addr, len, true,
935 has_zeropage = uffd_register_detect_zeropage(uffd, area_dst, page_size);
938 uffd_register_detect_zeropage(uffd, area_dst_alias, page_size);
940 if (do_uffdio_zeropage(uffd, has_zeropage))
945 if (uffd_unregister(uffd, area_dst, page_size))
948 if (area_dst_alias && uffd_unregister(uffd, area_dst_alias, page_size))
954 static void uffd_register_poison(int uffd, void *addr, uint64_t len)
959 if (uffd_register_with_ioctls(uffd, addr, len, true,
967 static void do_uffdio_poison(int uffd, unsigned long offset)
976 ret = ioctl(uffd, UFFDIO_POISON, &uffdio_poison);
1002 copy_page(uffd, offset, false);
1004 do_uffdio_poison(uffd, offset);
1016 fcntl(uffd, F_SETFL, uffd_flags | O_NONBLOCK);
1018 uffd_register_poison(uffd, area_dst, nr_pages * page_size);
1076 ret = uffd_register_with_ioctls(uffd, area_dst, page_size,
1107 if (uffd_unregister(uffd, area_dst, page_size))
1155 /* when set, child process should inherit uffd-wp bits */
1171 /* when set, child process should inherit uffd-wp bits */