KVM
Functions
page_track.h File Reference
#include <linux/kvm_host.h>
#include <asm/kvm_page_track.h>
Include dependency graph for page_track.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

bool kvm_page_track_write_tracking_enabled (struct kvm *kvm)
 
int kvm_page_track_write_tracking_alloc (struct kvm_memory_slot *slot)
 
void kvm_page_track_free_memslot (struct kvm_memory_slot *slot)
 
int kvm_page_track_create_memslot (struct kvm *kvm, struct kvm_memory_slot *slot, unsigned long npages)
 
void __kvm_write_track_add_gfn (struct kvm *kvm, struct kvm_memory_slot *slot, gfn_t gfn)
 
void __kvm_write_track_remove_gfn (struct kvm *kvm, struct kvm_memory_slot *slot, gfn_t gfn)
 
bool kvm_gfn_is_write_tracked (struct kvm *kvm, const struct kvm_memory_slot *slot, gfn_t gfn)
 
static int kvm_page_track_init (struct kvm *kvm)
 
static void kvm_page_track_cleanup (struct kvm *kvm)
 
static void __kvm_page_track_write (struct kvm *kvm, gpa_t gpa, const u8 *new, int bytes)
 
static void kvm_page_track_delete_slot (struct kvm *kvm, struct kvm_memory_slot *slot)
 
static bool kvm_page_track_has_external_user (struct kvm *kvm)
 
static void kvm_page_track_write (struct kvm_vcpu *vcpu, gpa_t gpa, const u8 *new, int bytes)
 

Function Documentation

◆ __kvm_page_track_write()

static void __kvm_page_track_write ( struct kvm *  kvm,
gpa_t  gpa,
const u8 *  new,
int  bytes 
)
inlinestatic

Definition at line 41 of file page_track.h.

42  { }
Here is the caller graph for this function:

◆ __kvm_write_track_add_gfn()

void __kvm_write_track_add_gfn ( struct kvm *  kvm,
struct kvm_memory_slot *  slot,
gfn_t  gfn 
)

Definition at line 77 of file page_track.c.

79 {
80  lockdep_assert_held_write(&kvm->mmu_lock);
81 
82  lockdep_assert_once(lockdep_is_held(&kvm->slots_lock) ||
83  srcu_read_lock_held(&kvm->srcu));
84 
85  if (KVM_BUG_ON(!kvm_page_track_write_tracking_enabled(kvm), kvm))
86  return;
87 
88  update_gfn_write_track(slot, gfn, 1);
89 
90  /*
91  * new track stops large page mapping for the
92  * tracked page.
93  */
94  kvm_mmu_gfn_disallow_lpage(slot, gfn);
95 
96  if (kvm_mmu_slot_gfn_write_protect(kvm, slot, gfn, PG_LEVEL_4K))
98 }
void kvm_flush_remote_tlbs(struct kvm *kvm)
Definition: kvm_main.c:346
bool kvm_mmu_slot_gfn_write_protect(struct kvm *kvm, struct kvm_memory_slot *slot, u64 gfn, int min_level)
Definition: mmu.c:1414
void kvm_mmu_gfn_disallow_lpage(const struct kvm_memory_slot *slot, gfn_t gfn)
Definition: mmu.c:817
bool kvm_page_track_write_tracking_enabled(struct kvm *kvm)
Definition: page_track.c:23
static void update_gfn_write_track(struct kvm_memory_slot *slot, gfn_t gfn, short count)
Definition: page_track.c:62
Here is the call graph for this function:
Here is the caller graph for this function:

◆ __kvm_write_track_remove_gfn()

void __kvm_write_track_remove_gfn ( struct kvm *  kvm,
struct kvm_memory_slot *  slot,
gfn_t  gfn 
)

Definition at line 100 of file page_track.c.

102 {
103  lockdep_assert_held_write(&kvm->mmu_lock);
104 
105  lockdep_assert_once(lockdep_is_held(&kvm->slots_lock) ||
106  srcu_read_lock_held(&kvm->srcu));
107 
108  if (KVM_BUG_ON(!kvm_page_track_write_tracking_enabled(kvm), kvm))
109  return;
110 
111  update_gfn_write_track(slot, gfn, -1);
112 
113  /*
114  * allow large page mapping for the tracked page
115  * after the tracker is gone.
116  */
117  kvm_mmu_gfn_allow_lpage(slot, gfn);
118 }
void kvm_mmu_gfn_allow_lpage(const struct kvm_memory_slot *slot, gfn_t gfn)
Definition: mmu.c:822
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kvm_gfn_is_write_tracked()

bool kvm_gfn_is_write_tracked ( struct kvm *  kvm,
const struct kvm_memory_slot *  slot,
gfn_t  gfn 
)

Definition at line 123 of file page_track.c.

125 {
126  int index;
127 
128  if (!slot)
129  return false;
130 
132  return false;
133 
134  index = gfn_to_index(gfn, slot->base_gfn, PG_LEVEL_4K);
135  return !!READ_ONCE(slot->arch.gfn_write_track[index]);
136 }
static gfn_t gfn_to_index(gfn_t gfn, gfn_t base_gfn, int level)
Definition: mmu.h:284
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kvm_page_track_cleanup()

static void kvm_page_track_cleanup ( struct kvm *  kvm)
inlinestatic

Definition at line 39 of file page_track.h.

39 { }
Here is the caller graph for this function:

◆ kvm_page_track_create_memslot()

int kvm_page_track_create_memslot ( struct kvm *  kvm,
struct kvm_memory_slot *  slot,
unsigned long  npages 
)

Definition at line 47 of file page_track.c.

50 {
52  return 0;
53 
54  return __kvm_page_track_write_tracking_alloc(slot, npages);
55 }
static int __kvm_page_track_write_tracking_alloc(struct kvm_memory_slot *slot, unsigned long npages)
Definition: page_track.c:35
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kvm_page_track_delete_slot()

static void kvm_page_track_delete_slot ( struct kvm *  kvm,
struct kvm_memory_slot *  slot 
)
inlinestatic

Definition at line 43 of file page_track.h.

44  { }
Here is the caller graph for this function:

◆ kvm_page_track_free_memslot()

void kvm_page_track_free_memslot ( struct kvm_memory_slot *  slot)

Definition at line 29 of file page_track.c.

30 {
31  kvfree(slot->arch.gfn_write_track);
32  slot->arch.gfn_write_track = NULL;
33 }
Here is the caller graph for this function:

◆ kvm_page_track_has_external_user()

static bool kvm_page_track_has_external_user ( struct kvm *  kvm)
inlinestatic

Definition at line 46 of file page_track.h.

46 { return false; }
Here is the caller graph for this function:

◆ kvm_page_track_init()

static int kvm_page_track_init ( struct kvm *  kvm)
inlinestatic

Definition at line 38 of file page_track.h.

38 { return 0; }
Here is the caller graph for this function:

◆ kvm_page_track_write()

static void kvm_page_track_write ( struct kvm_vcpu *  vcpu,
gpa_t  gpa,
const u8 *  new,
int  bytes 
)
inlinestatic

Definition at line 50 of file page_track.h.

52 {
53  __kvm_page_track_write(vcpu->kvm, gpa, new, bytes);
54 
55  kvm_mmu_track_write(vcpu, gpa, new, bytes);
56 }
void kvm_mmu_track_write(struct kvm_vcpu *vcpu, gpa_t gpa, const u8 *new, int bytes)
Definition: mmu.c:5781
static void __kvm_page_track_write(struct kvm *kvm, gpa_t gpa, const u8 *new, int bytes)
Definition: page_track.h:41
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kvm_page_track_write_tracking_alloc()

int kvm_page_track_write_tracking_alloc ( struct kvm_memory_slot *  slot)

Definition at line 57 of file page_track.c.

58 {
59  return __kvm_page_track_write_tracking_alloc(slot, slot->npages);
60 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kvm_page_track_write_tracking_enabled()

bool kvm_page_track_write_tracking_enabled ( struct kvm *  kvm)

Definition at line 23 of file page_track.c.

24 {
25  return IS_ENABLED(CONFIG_KVM_EXTERNAL_WRITE_TRACKING) ||
27 }
bool tdp_enabled
Definition: mmu.c:106
static bool kvm_shadow_root_allocated(struct kvm *kvm)
Definition: mmu.h:262
Here is the call graph for this function:
Here is the caller graph for this function: