1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * KVM userfaultfd util 4 * 5 * Copyright (C) 2018, Red Hat, Inc. 6 * Copyright (C) 2019-2022 Google LLC 7 */ 8 #include <inttypes.h> 9 #include <time.h> 10 #include <pthread.h> 11 #include <linux/userfaultfd.h> 12 13 #include "test_util.h" 14 15 typedef int (*uffd_handler_t)(int uffd_mode, int uffd, struct uffd_msg *msg); 16 17 struct uffd_reader_args { 18 int uffd_mode; 19 int uffd; 20 useconds_t delay; 21 uffd_handler_t handler; 22 /* Holds the read end of the pipe for killing the reader. */ 23 int pipe; 24 }; 25 26 struct uffd_desc { 27 int uffd; 28 uint64_t num_readers; 29 /* Holds the write ends of the pipes for killing the readers. */ 30 int *pipefds; 31 pthread_t *readers; 32 struct uffd_reader_args *reader_args; 33 }; 34 35 struct uffd_desc *uffd_setup_demand_paging(int uffd_mode, useconds_t delay, 36 void *hva, uint64_t len, 37 uint64_t num_readers, 38 uffd_handler_t handler); 39 40 void uffd_stop_demand_paging(struct uffd_desc *uffd); 41 42 #ifdef PRINT_PER_PAGE_UPDATES 43 #define PER_PAGE_DEBUG(...) printf(__VA_ARGS__) 44 #else 45 #define PER_PAGE_DEBUG(...) _no_printf(__VA_ARGS__) 46 #endif 47 48 #ifdef PRINT_PER_VCPU_UPDATES 49 #define PER_VCPU_DEBUG(...) printf(__VA_ARGS__) 50 #else 51 #define PER_VCPU_DEBUG(...) _no_printf(__VA_ARGS__) 52 #endif 53