Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/virt/kvm/kvm_mm.h
26278 views
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
3
#ifndef __KVM_MM_H__
4
#define __KVM_MM_H__ 1
5
6
/*
7
* Architectures can choose whether to use an rwlock or spinlock
8
* for the mmu_lock. These macros, for use in common code
9
* only, avoids using #ifdefs in places that must deal with
10
* multiple architectures.
11
*/
12
13
#ifdef KVM_HAVE_MMU_RWLOCK
14
#define KVM_MMU_LOCK_INIT(kvm) rwlock_init(&(kvm)->mmu_lock)
15
#define KVM_MMU_LOCK(kvm) write_lock(&(kvm)->mmu_lock)
16
#define KVM_MMU_UNLOCK(kvm) write_unlock(&(kvm)->mmu_lock)
17
#else
18
#define KVM_MMU_LOCK_INIT(kvm) spin_lock_init(&(kvm)->mmu_lock)
19
#define KVM_MMU_LOCK(kvm) spin_lock(&(kvm)->mmu_lock)
20
#define KVM_MMU_UNLOCK(kvm) spin_unlock(&(kvm)->mmu_lock)
21
#endif /* KVM_HAVE_MMU_RWLOCK */
22
23
24
struct kvm_follow_pfn {
25
const struct kvm_memory_slot *slot;
26
const gfn_t gfn;
27
28
unsigned long hva;
29
30
/* FOLL_* flags modifying lookup behavior, e.g. FOLL_WRITE. */
31
unsigned int flags;
32
33
/*
34
* Pin the page (effectively FOLL_PIN, which is an mm/ internal flag).
35
* The page *must* be pinned if KVM will write to the page via a kernel
36
* mapping, e.g. via kmap(), mremap(), etc.
37
*/
38
bool pin;
39
40
/*
41
* If non-NULL, try to get a writable mapping even for a read fault.
42
* Set to true if a writable mapping was obtained.
43
*/
44
bool *map_writable;
45
46
/*
47
* Optional output. Set to a valid "struct page" if the returned pfn
48
* is for a refcounted or pinned struct page, NULL if the returned pfn
49
* has no struct page or if the struct page is not being refcounted
50
* (e.g. tail pages of non-compound higher order allocations from
51
* IO/PFNMAP mappings).
52
*/
53
struct page **refcounted_page;
54
};
55
56
kvm_pfn_t hva_to_pfn(struct kvm_follow_pfn *kfp);
57
58
#ifdef CONFIG_HAVE_KVM_PFNCACHE
59
void gfn_to_pfn_cache_invalidate_start(struct kvm *kvm,
60
unsigned long start,
61
unsigned long end);
62
#else
63
static inline void gfn_to_pfn_cache_invalidate_start(struct kvm *kvm,
64
unsigned long start,
65
unsigned long end)
66
{
67
}
68
#endif /* HAVE_KVM_PFNCACHE */
69
70
#ifdef CONFIG_KVM_PRIVATE_MEM
71
void kvm_gmem_init(struct module *module);
72
int kvm_gmem_create(struct kvm *kvm, struct kvm_create_guest_memfd *args);
73
int kvm_gmem_bind(struct kvm *kvm, struct kvm_memory_slot *slot,
74
unsigned int fd, loff_t offset);
75
void kvm_gmem_unbind(struct kvm_memory_slot *slot);
76
#else
77
static inline void kvm_gmem_init(struct module *module)
78
{
79
80
}
81
82
static inline int kvm_gmem_bind(struct kvm *kvm,
83
struct kvm_memory_slot *slot,
84
unsigned int fd, loff_t offset)
85
{
86
WARN_ON_ONCE(1);
87
return -EIO;
88
}
89
90
static inline void kvm_gmem_unbind(struct kvm_memory_slot *slot)
91
{
92
WARN_ON_ONCE(1);
93
}
94
#endif /* CONFIG_KVM_PRIVATE_MEM */
95
96
#endif /* __KVM_MM_H__ */
97
98