| /linux/tools/testing/selftests/kvm/lib/ |
| H A D | userfaultfd_util.c | 29 int uffd = reader_args->uffd; in uffd_handler_thread_fn() local 41 TEST_ASSERT(!epoll_ctl(epollfd, EPOLL_CTL_ADD, uffd, &evt), in uffd_handler_thread_fn() 73 r = read(uffd, &msg, sizeof(msg)); in uffd_handler_thread_fn() 88 r = reader_args->handler(reader_args->uffd_mode, uffd, &msg); in uffd_handler_thread_fn() 109 int uffd; in uffd_setup_demand_paging() local 137 uffd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK); in uffd_setup_demand_paging() 138 TEST_ASSERT(uffd >= 0, "uffd creation failed, errno: %d", errno); in uffd_setup_demand_paging() 142 TEST_ASSERT(ioctl(uffd, UFFDIO_API, &uffdio_api) != -1, in uffd_setup_demand_paging() 149 TEST_ASSERT(ioctl(uffd, UFFDIO_REGISTER, &uffdio_register) != -1, in uffd_setup_demand_paging() 154 uffd_desc->uffd = uffd; in uffd_setup_demand_paging() [all …]
|
| /linux/tools/testing/selftests/bpf/prog_tests/ |
| H A D | bpf_mod_race.c | 67 int uffd; in test_setup_uffd() local 69 uffd = sys_userfaultfd(O_CLOEXEC); in test_setup_uffd() 70 if (uffd < 0) in test_setup_uffd() 75 if (ioctl(uffd, UFFDIO_API, &uffd_api)) { in test_setup_uffd() 76 close(uffd); in test_setup_uffd() 83 if (ioctl(uffd, UFFDIO_REGISTER, &uffd_register)) { in test_setup_uffd() 84 close(uffd); in test_setup_uffd() 87 return uffd; in test_setup_uffd() 97 int uffd, ret; in test_bpf_mod_race_config() local 120 uffd = test_setup_uffd(fault_addr); in test_bpf_mod_race_config() [all …]
|
| /linux/tools/testing/selftests/powerpc/tm/ |
| H A D | tm-signal-pagefault.c | 86 long uffd; /* userfaultfd file descriptor */ in fault_handler_thread() local 91 uffd = (long) arg; in fault_handler_thread() 94 pollfd.fd = uffd; in fault_handler_thread() 101 nread = read(uffd, &msg, sizeof(msg)); in fault_handler_thread() 130 if (ioctl(uffd, UFFDIO_COPY, &uffdio_copy) == -1) { in fault_handler_thread() 139 long uffd; /* userfaultfd file descriptor */ in setup_uf_mem() local 148 uffd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK); in setup_uf_mem() 149 if (uffd == -1) { in setup_uf_mem() 155 if (ioctl(uffd, UFFDIO_API, &uffdio_api) == -1) { in setup_uf_mem() 180 if (ioctl(uffd, UFFDIO_REGISTER, &uffdio_register) == -1) { in setup_uf_mem() [all …]
|
| /linux/tools/testing/selftests/mm/ |
| H A D | uffd-common.c | 261 gopts->uffd = uffd_open(UFFD_FLAGS); in userfaultfd_open() 262 if (gopts->uffd < 0) in userfaultfd_open() 264 gopts->uffd_flags = fcntl(gopts->uffd, F_GETFD, NULL); in userfaultfd_open() 268 if (ioctl(gopts->uffd, UFFDIO_API, &uffdio_api)) in userfaultfd_open() 305 if (gopts->uffd != -1) { in uffd_test_ctx_clear() 306 if (close(gopts->uffd)) in uffd_test_ctx_clear() 308 gopts->uffd = -1; in uffd_test_ctx_clear() 445 int ret = read(gopts->uffd, msg, sizeof(*msg)); in uffd_read_msg() 470 wp_range(gopts->uffd, msg->arg.pagefault.address, gopts->page_size, false); in uffd_handle_page_fault() 493 continue_range(gopts->uffd, msg->arg.pagefault.address, gopts->page_size, in uffd_handle_page_fault() [all …]
|
| H A D | uffd-unit-tests.c | 8 #include "uffd-common.h" 72 /* Arguments to be passed over to each uffd unit test */ 113 int uffd; 119 uffd = uffd_open_dev(UFFD_FLAGS); in uffd_test_skip() 121 uffd = uffd_open_sys(UFFD_FLAGS); in uffd_test_skip() 122 if (uffd < 0) { in uffd_test_skip() 130 if (ioctl(uffd, UFFDIO_API, &uffdio_api) == 0) { in test_uffd_api() 138 if (ioctl(uffd, UFFDIO_API, &uffdio_api) == 0) { in test_uffd_api() 146 if (ioctl(uffd, UFFDIO_API, &uffdio_api)) { in test_uffd_api() 153 if (ioctl(uffd, UFFDIO_AP in test_uffd_api() 132 int uffd; test_uffd_api() local 922 uffd_register_detect_zeropage(int uffd,void * addr,uint64_t len) uffd_register_detect_zeropage() argument 962 uffd_register_poison(int uffd,void * addr,uint64_t len) uffd_register_poison() argument [all...] |
| H A D | Makefile | 93 TEST_GEN_FILES += uffd-stress 94 TEST_GEN_FILES += uffd-unit-tests 95 TEST_GEN_FILES += uffd-wp-mremap 193 $(OUTPUT)/uffd-stress: uffd-common.c 194 $(OUTPUT)/uffd-unit-tests: uffd-common.c 195 $(OUTPUT)/uffd-wp-mremap: uffd-common.c
|
| H A D | ksm_functional_tests.c | 296 int uffd; in test_unmerge_uffd_wp() local 305 uffd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK); in test_unmerge_uffd_wp() 306 if (uffd < 0) { in test_unmerge_uffd_wp() 314 if (ioctl(uffd, UFFDIO_API, &uffdio_api) < 0) { in test_unmerge_uffd_wp() 332 close(uffd); in test_unmerge_uffd_wp() 333 uffd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK); in test_unmerge_uffd_wp() 334 if (uffd < 0) { in test_unmerge_uffd_wp() 342 if (ioctl(uffd, UFFDIO_API, &uffdio_api) < 0) { in test_unmerge_uffd_wp() 348 if (uffd_register(uffd, map, size, false, true, false)) { in test_unmerge_uffd_wp() 357 if (ioctl(uffd, UFFDIO_WRITEPROTEC in test_unmerge_uffd_wp() [all...] |
| H A D | hugepage-mremap.c | |
| H A D | mkdirty.c | 275 int uffd; in test_uffdio_copy() local 288 uffd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK); in test_uffdio_copy() 289 if (uffd < 0) { in test_uffdio_copy() 296 if (ioctl(uffd, UFFDIO_API, &uffdio_api) < 0) { in test_uffdio_copy() 304 if (ioctl(uffd, UFFDIO_REGISTER, &uffdio_register)) { in test_uffdio_copy() 314 if (ioctl(uffd, UFFDIO_COPY, &uffdio_copy)) { in test_uffdio_copy() 321 close(uffd); in test_uffdio_copy()
|
| H A D | uffd-stress.c | 37 #include "uffd-common.h" 64 "./uffd-stress anon 100 99999\n\n" 66 "./uffd-stress shmem 1000 99\n\n" 68 "./uffd-stress hugetlb 256 50\n\n" 70 "./uffd-stress hugetlb-private 256 50\n\n" 73 "while ./uffd-stress anon $[RANDOM % 6000 + 10] 999; do true; done\n\n"; 77 fprintf(stderr, "\nUsage: ./uffd-stress <test type> <MiB> <bounces>\n\n"); in usage() 175 * If we need to test uffd-wp, set it up now. Then we'll have in background_thread() 180 wp_range(gopts->uffd, (unsigned long)gopts->area_dst + start_nr * gopts->page_size, in background_thread() 298 fcntl(gopts->uffd, F_SETF in userfaultfd_stress() [all...] |
| H A D | .gitignore | 35 uffd-stress 36 uffd-unit-tests 37 uffd-wp-mremap
|
| H A D | uffd-wp-mremap.c | 12 #include "uffd-common.h" 30 ksft_exit_skip("uffd-wp feature not supported\n"); in detect_thp_sizes() 148 ksft_test_result_fail("uffd-wp not %s for pte %lu!\n", in range_is_swapped() 190 /* Register range for uffd-wp. */ in test_one_folio() 198 if (uffd_register(gopts->uffd, mem, size, false, true, false)) { in test_one_folio() 205 if (ioctl(gopts->uffd, UFFDIO_WRITEPROTECT, &wp_prms)) { in test_one_folio() 218 /* Check that uffd-wp is set for all PTEs in range. */ in test_one_folio() 224 * UFFD_FEATURE_EVENT_REMAP is not set, we expect the uffd-wp bit for in test_one_folio() 239 /* Check that uffd-wp is cleared for all PTEs in range. */ in test_one_folio() 252 if (gopts->uffd > [all...] |
| H A D | vm_util.h | 99 int uffd_register(int uffd, void *addr, uint64_t len, 101 int uffd_unregister(int uffd, void *addr, uint64_t len); 102 int uffd_register_with_ioctls(int uffd, void *addr, uint64_t len,
|
| H A D | vm_util.c | 307 int uffd_register_with_ioctls(int uffd, void *addr, uint64_t len, in default_huge_page_size() 325 if (ioctl(uffd, UFFDIO_REGISTER, &uffdio_register) == -1) in detect_hugetlb_page_sizes() 333 int uffd_register(int uffd, void *addr, uint64_t len, in detect_hugetlb_page_sizes() 336 return uffd_register_with_ioctls(uffd, addr, len, in detect_hugetlb_page_sizes() 340 int uffd_unregister(int uffd, void *addr, uint64_t len) 345 if (ioctl(uffd, UFFDIO_UNREGISTER, &range) == -1) in pageflags_get() 355 uffd_register_with_ioctls(int uffd,void * addr,uint64_t len,bool miss,bool wp,bool minor,uint64_t * ioctls) uffd_register_with_ioctls() argument 381 uffd_register(int uffd,void * addr,uint64_t len,bool miss,bool wp,bool minor) uffd_register() argument 388 uffd_unregister(int uffd,void * addr,uint64_t len) uffd_unregister() argument
|
| H A D | mremap_test.c | 737 int uffd, err, i; in mremap_move_multiple_vmas_split() 744 uffd = syscall(__NR_userfaultfd, O_NONBLOCK); in mremap_move_multiple_vmas_split() 745 if (uffd == -1) { in mremap_move_multiple_vmas_split() 749 ksft_test_result_skip("%s - missing uffd", test_name); 755 if (ioctl(uffd, UFFDIO_API, &api)) { in mremap_move_multi_invalid_vmas() 801 if (ioctl(uffd, UFFDIO_REGISTER, ®) == -1) { in mremap_move_multi_invalid_vmas() 822 fprintf(stderr, "mremap() succeeded for multi VMA uffd armed\n"); in mremap_move_multi_invalid_vmas() 834 "Invalid uffd-armed VMA at start of multi range moved\n"); in mremap_move_multi_invalid_vmas() 852 * Unmap the VMA, and remap a non-uffd registered (therefore, multi VMA in mremap_move_multi_invalid_vmas() 875 fprintf(stderr, "mremap() succeeded for multi VMA uffd arme in mremap_move_multi_invalid_vmas() 758 int uffd, err, i; mremap_move_multi_invalid_vmas() local [all...] |
| H A D | run_vmtests.sh | 293 CATEGORY="userfaultfd" run_test ./uffd-unit-tests 294 uffd_stress_bin=./uffd-stress 300 CATEGORY="userfaultfd" run_test ./uffd-wp-mremap
|
| H A D | guard-regions.c | 1481 TEST_F(guard_regions, uffd) in TEST_F() 1484 int uffd; in TEST_F() 1495 SKIP(return, "uffd only works on anon backing"); in TEST_F() 1497 /* Set up uffd. */ in TEST_F() 1498 uffd = userfaultfd(0); in TEST_F() 1499 if (uffd == -1) { in TEST_F() 1514 ASSERT_NE(uffd, -1); in TEST_F() 1516 ASSERT_EQ(ioctl(uffd, UFFDIO_API, &api), 0); in TEST_F() 1523 /* Register the range with uffd. */ in TEST_F() 1528 ASSERT_EQ(ioctl(uffd, UFFDIO_REGISTE in TEST_F() 1480 TEST_F(guard_regions,uffd) TEST_F() argument 1483 int uffd; TEST_F() local [all...] |
| H A D | uffd-common.h | 62 int uffd, uffd_flags, finished, *pipefd, test_type; member
|
| H A D | pagemap_ioctl.c | 39 int uffd; variable 99 uffd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK | UFFD_USER_MODE_ONLY); in init_uffd() 100 if (uffd == -1) in init_uffd() 101 return uffd; in init_uffd() 106 if (ioctl(uffd, UFFDIO_API, &uffdio_api)) in init_uffd() 126 if (ioctl(uffd, UFFDIO_REGISTER, &uffdio_register)) in wp_init() 136 if (ioctl(uffd, UFFDIO_WRITEPROTECT, &wp)) in wp_init() 149 if (ioctl(uffd, UFFDIO_UNREGISTER, &uffdio_register.range)) in wp_free()
|
| /linux/tools/testing/selftests/kvm/include/ |
| H A D | userfaultfd_util.h | 15 typedef int (*uffd_handler_t)(int uffd_mode, int uffd, struct uffd_msg *msg); 19 int uffd; member 27 int uffd; member 40 void uffd_stop_demand_paging(struct uffd_desc *uffd);
|
| /linux/tools/testing/selftests/x86/ |
| H A D | test_shadow_stack.c | 458 int uffd = *(int *)arg; in uffd_thread() local 463 ret = read(uffd, &msg, sizeof(msg)); in uffd_thread() 476 if (ioctl(uffd, UFFDIO_COPY, &req)) in uffd_thread() 489 int uffd; in test_userfaultfd() local 496 uffd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK); in test_userfaultfd() 497 if (uffd < 0) { in test_userfaultfd() 506 if (ioctl(uffd, UFFDIO_API, &uffdio_api)) in test_userfaultfd() 512 if (ioctl(uffd, UFFDIO_REGISTER, &uffdio_register)) in test_userfaultfd() 515 if (pthread_create(&thread, NULL, &uffd_thread, &uffd)) in test_userfaultfd() 536 close(uffd); in test_userfaultfd()
|
| /linux/tools/testing/selftests/kvm/ |
| H A D | demand_paging_test.c | 57 static int handle_uffd_page_request(int uffd_mode, int uffd, in handle_uffd_page_request() argument 76 r = ioctl(uffd, UFFDIO_COPY, ©); in handle_uffd_page_request() 100 r = ioctl(uffd, UFFDIO_CONTINUE, &cont); in handle_uffd_page_request()
|
| /linux/tools/testing/selftests/kvm/arm64/ |
| H A D | page_fault_test.c | 309 static int uffd_generic_handler(int uffd_mode, int uffd, struct uffd_msg *msg, in uffd_generic_handler() argument 329 ret = ioctl(uffd, UFFDIO_COPY, ©); in uffd_generic_handler() 342 static int uffd_pt_handler(int mode, int uffd, struct uffd_msg *msg) in uffd_pt_handler() argument 344 return uffd_generic_handler(mode, uffd, msg, &pt_args); in uffd_pt_handler() 347 static int uffd_data_handler(int mode, int uffd, struct uffd_msg *msg) in uffd_data_handler() argument 349 return uffd_generic_handler(mode, uffd, msg, &data_args); in uffd_data_handler() 399 static int uffd_no_handler(int mode, int uffd, struct uffd_msg *msg) in uffd_no_handler() argument 789 .name = SCAT4(uffd, _access, _with_af, #_mark_cmd), \
|
| /linux/Documentation/admin-guide/mm/ |
| H A D | userfaultfd.rst | 187 uffd. You can supply as many pages as you want with these IOCTLs. 203 ``ioctl(uffd, UFFDIO_WRITEPROTECT, struct *uffdio_writeprotect)`` 208 Then, in the thread reading from uffd the struct will have 210 ``ioctl(uffd, UFFDIO_WRITEPROTECT, struct *uffdio_writeprotect)`` 213 allows you to do the bookkeeping about the write in the uffd reading 268 - Due to a reverted meaning of soft-dirty (page clean when uffd-wp bit 269 set; dirty when uffd-wp bit cleared), it has different semantics on 272 dirtying of memory by dropping uffd-wp bit during the procedure. 275 uffd-wp bit for the pages being interested in /proc/pagemap. 277 The page will not be under track of uffd-wp async mode until the page is
|
| H A D | pagemap.rst | 22 * Bit 57 pte is uffd-wp write-protected (since 5.13) (see 303 "PAGE_IS_WRITTEN" category is used with uffd write protect-enabled ranges to
|