| 1 |
|
| 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 |
|
| 23 | int pipe;
|
| 24 | };
|
| 25 |
|
| 26 | struct uffd_desc {
|
| 27 | int uffd;
|
| 28 | u64 num_readers;
|
| 29 |
|
| 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, u64 len,
|
| 37 | u64 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
|