Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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
15typedef int (*uffd_handler_t)(int uffd_mode, int uffd, struct uffd_msg *msg);
16
17struct 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
26struct 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
35struct 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
40void 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