| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * KVM userfaultfd util |
| * |
| * Copyright (C) 2018, Red Hat, Inc. |
| * Copyright (C) 2019-2022 Google LLC |
| */ |
| |
| #define _GNU_SOURCE /* for pipe2 */ |
| |
| #include <inttypes.h> |
| #include <time.h> |
| #include <pthread.h> |
| #include <linux/userfaultfd.h> |
| |
| #include "test_util.h" |
| |
| typedef int (*uffd_handler_t)(int uffd_mode, int uffd, struct uffd_msg *msg); |
| |
| struct uffd_desc { |
| int uffd_mode; |
| int uffd; |
| int pipefds[2]; |
| useconds_t delay; |
| uffd_handler_t handler; |
| pthread_t thread; |
| }; |
| |
| struct uffd_desc *uffd_setup_demand_paging(int uffd_mode, useconds_t delay, |
| void *hva, uint64_t len, |
| uffd_handler_t handler); |
| |
| void uffd_stop_demand_paging(struct uffd_desc *uffd); |
| |
| #ifdef PRINT_PER_PAGE_UPDATES |
| #define PER_PAGE_DEBUG(...) printf(__VA_ARGS__) |
| #else |
| #define PER_PAGE_DEBUG(...) _no_printf(__VA_ARGS__) |
| #endif |
| |
| #ifdef PRINT_PER_VCPU_UPDATES |
| #define PER_VCPU_DEBUG(...) printf(__VA_ARGS__) |
| #else |
| #define PER_VCPU_DEBUG(...) _no_printf(__VA_ARGS__) |
| #endif |