Skip to content

Commit bab4165

Browse files
whitebrandybonzini
authored andcommitted
kvm: x86: Add a hook for arch specific dirty logging emulation
When KVM updates accessed/dirty bits, this hook can be used to invoke an arch specific function that implements/emulates dirty logging such as PML. Signed-off-by: Bandan Das <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]>
1 parent c7c2c70 commit bab4165

File tree

4 files changed

+22
-0
lines changed

4 files changed

+22
-0
lines changed

arch/x86/include/asm/kvm_host.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,6 +1020,8 @@ struct kvm_x86_ops {
10201020
void (*enable_log_dirty_pt_masked)(struct kvm *kvm,
10211021
struct kvm_memory_slot *slot,
10221022
gfn_t offset, unsigned long mask);
1023+
int (*write_log_dirty)(struct kvm_vcpu *vcpu);
1024+
10231025
/* pmu operations of sub-arch */
10241026
const struct kvm_pmu_ops *pmu_ops;
10251027

arch/x86/kvm/mmu.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1498,6 +1498,21 @@ void kvm_arch_mmu_enable_log_dirty_pt_masked(struct kvm *kvm,
14981498
kvm_mmu_write_protect_pt_masked(kvm, slot, gfn_offset, mask);
14991499
}
15001500

1501+
/**
1502+
* kvm_arch_write_log_dirty - emulate dirty page logging
1503+
* @vcpu: Guest mode vcpu
1504+
*
1505+
* Emulate arch specific page modification logging for the
1506+
* nested hypervisor
1507+
*/
1508+
int kvm_arch_write_log_dirty(struct kvm_vcpu *vcpu)
1509+
{
1510+
if (kvm_x86_ops->write_log_dirty)
1511+
return kvm_x86_ops->write_log_dirty(vcpu);
1512+
1513+
return 0;
1514+
}
1515+
15011516
bool kvm_mmu_slot_gfn_write_protect(struct kvm *kvm,
15021517
struct kvm_memory_slot *slot, u64 gfn)
15031518
{

arch/x86/kvm/mmu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,4 +202,5 @@ void kvm_mmu_gfn_disallow_lpage(struct kvm_memory_slot *slot, gfn_t gfn);
202202
void kvm_mmu_gfn_allow_lpage(struct kvm_memory_slot *slot, gfn_t gfn);
203203
bool kvm_mmu_slot_gfn_write_protect(struct kvm *kvm,
204204
struct kvm_memory_slot *slot, u64 gfn);
205+
int kvm_arch_write_log_dirty(struct kvm_vcpu *vcpu);
205206
#endif

arch/x86/kvm/paging_tmpl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,10 @@ static int FNAME(update_accessed_dirty_bits)(struct kvm_vcpu *vcpu,
226226
if (level == walker->level && write_fault &&
227227
!(pte & PT_GUEST_DIRTY_MASK)) {
228228
trace_kvm_mmu_set_dirty_bit(table_gfn, index, sizeof(pte));
229+
#if PTTYPE == PTTYPE_EPT
230+
if (kvm_arch_write_log_dirty(vcpu))
231+
return -EINVAL;
232+
#endif
229233
pte |= PT_GUEST_DIRTY_MASK;
230234
}
231235
if (pte == orig_pte)

0 commit comments

Comments
 (0)