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
9#define _GNU_SOURCE /* for pipe2 */
10
11#include <inttypes.h>
12#include <time.h>
13#include <pthread.h>
14#include <linux/userfaultfd.h>
15
16#include "test_util.h"
17
18typedef int (*uffd_handler_t)(int uffd_mode, int uffd, struct uffd_msg *msg);
19
20struct uffd_desc {
21	int uffd_mode;
22	int uffd;
23	int pipefds[2];
24	useconds_t delay;
25	uffd_handler_t handler;
26	pthread_t thread;
27};
28
29struct uffd_desc *uffd_setup_demand_paging(int uffd_mode, useconds_t delay,
30					   void *hva, uint64_t len,
31					   uffd_handler_t handler);
32
33void uffd_stop_demand_paging(struct uffd_desc *uffd);
34
35#ifdef PRINT_PER_PAGE_UPDATES
36#define PER_PAGE_DEBUG(...) printf(__VA_ARGS__)
37#else
38#define PER_PAGE_DEBUG(...) _no_printf(__VA_ARGS__)
39#endif
40
41#ifdef PRINT_PER_VCPU_UPDATES
42#define PER_VCPU_DEBUG(...) printf(__VA_ARGS__)
43#else
44#define PER_VCPU_DEBUG(...) _no_printf(__VA_ARGS__)
45#endif
46