KVM: pfncache: add a mark-dirty helper
authorPaul Durrant <pdurrant@amazon.com>
Thu, 15 Feb 2024 15:28:59 +0000 (15:28 +0000)
committerSean Christopherson <seanjc@google.com>
Tue, 20 Feb 2024 15:37:42 +0000 (07:37 -0800)
At the moment pages are marked dirty by open-coded calls to
mark_page_dirty_in_slot(), directly deferefencing the gpa and memslot
from the cache. After a subsequent patch these may not always be set
so add a helper now so that caller will protected from the need to know
about this detail.

Signed-off-by: Paul Durrant <pdurrant@amazon.com>
Reviewed-by: David Woodhouse <dwmw@amazon.co.uk>
Link: https://lore.kernel.org/r/20240215152916.1158-5-paul@xen.org
[sean: decrease indentation, use gpa_to_gfn()]
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/x86.c
arch/x86/kvm/xen.c
include/linux/kvm_host.h

index bf10a90..f0f37c7 100644 (file)
@@ -3160,7 +3160,7 @@ static void kvm_setup_guest_pvclock(struct kvm_vcpu *v,
 
        guest_hv_clock->version = ++vcpu->hv_clock.version;
 
-       mark_page_dirty_in_slot(v->kvm, gpc->memslot, gpc->gpa >> PAGE_SHIFT);
+       kvm_gpc_mark_dirty_in_slot(gpc);
        read_unlock_irqrestore(&gpc->lock, flags);
 
        trace_kvm_pvclock_update(v->vcpu_id, &vcpu->hv_clock);
index f332750..2d001a9 100644 (file)
@@ -453,11 +453,11 @@ static void kvm_xen_update_runstate_guest(struct kvm_vcpu *v, bool atomic)
        }
 
        if (user_len2) {
-               mark_page_dirty_in_slot(v->kvm, gpc2->memslot, gpc2->gpa >> PAGE_SHIFT);
+               kvm_gpc_mark_dirty_in_slot(gpc2);
                read_unlock(&gpc2->lock);
        }
 
-       mark_page_dirty_in_slot(v->kvm, gpc1->memslot, gpc1->gpa >> PAGE_SHIFT);
+       kvm_gpc_mark_dirty_in_slot(gpc1);
        read_unlock_irqrestore(&gpc1->lock, flags);
 }
 
@@ -565,7 +565,7 @@ void kvm_xen_inject_pending_events(struct kvm_vcpu *v)
                WRITE_ONCE(vi->evtchn_upcall_pending, 1);
        }
 
-       mark_page_dirty_in_slot(v->kvm, gpc->memslot, gpc->gpa >> PAGE_SHIFT);
+       kvm_gpc_mark_dirty_in_slot(gpc);
        read_unlock_irqrestore(&gpc->lock, flags);
 
        /* For the per-vCPU lapic vector, deliver it as MSI. */
index 7e7fd25..604ae28 100644 (file)
@@ -1795,6 +1795,16 @@ static inline bool kvm_is_error_gpa(struct kvm *kvm, gpa_t gpa)
        return kvm_is_error_hva(hva);
 }
 
+static inline void kvm_gpc_mark_dirty_in_slot(struct gfn_to_pfn_cache *gpc)
+{
+       lockdep_assert_held(&gpc->lock);
+
+       if (!gpc->memslot)
+               return;
+
+       mark_page_dirty_in_slot(gpc->kvm, gpc->memslot, gpa_to_gfn(gpc->gpa));
+}
+
 enum kvm_stat_kind {
        KVM_STAT_VM,
        KVM_STAT_VCPU,