]> xenbits.xensource.com Git - people/pauldu/linux.git/commitdiff
KVM: pfncache: add a mark-dirty helper
authorPaul Durrant <pdurrant@amazon.com>
Thu, 7 Sep 2023 16:03:40 +0000 (16:03 +0000)
committerPaul Durrant <pdurrant@amazon.com>
Wed, 14 Feb 2024 16:32:10 +0000 (16:32 +0000)
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>
---
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Sean Christopherson <seanjc@google.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: x86@kernel.org
v13:
 - s/kvm_gpc_mark_dirty/kvm_gpc_mark_dirty_in_slot
 - Add a check for a NULL memslot pointer

v8:
 - Make the helper a static inline.

arch/x86/kvm/x86.c
arch/x86/kvm/xen.c
include/linux/kvm_host.h

index b66c45e7f6f8f24dd9fd828dcbb2e1ecd4617f7f..16269430006f22e59fc4a2dd3f6210ad1db7fbb7 100644 (file)
@@ -3151,7 +3151,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 f3327508ae415cbdccab62c641d011ade4f7c481..2d001a9c63787e0f58781cfbf8d48d9f3ef12533 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 bbfefd7e612f7418a3fe77b281e6ed91b49eabab..5a27b4389d327ebf4decca1cf9bc0b416987149e 100644 (file)
@@ -1398,6 +1398,19 @@ int kvm_gpc_refresh(struct gfn_to_pfn_cache *gpc, unsigned long len);
  */
 void kvm_gpc_deactivate(struct gfn_to_pfn_cache *gpc);
 
+/**
+ * kvm_gpc_mark_dirty_in_slot - mark a cached guest page as dirty.
+ *
+ * @gpc:          struct gfn_to_pfn_cache object.
+ */
+static inline void kvm_gpc_mark_dirty_in_slot(struct gfn_to_pfn_cache *gpc)
+{
+       lockdep_assert_held(&gpc->lock);
+       if (gpc->memslot)
+               mark_page_dirty_in_slot(gpc->kvm, gpc->memslot,
+                                       gpc->gpa >> PAGE_SHIFT);
+}
+
 void kvm_sigset_activate(struct kvm_vcpu *vcpu);
 void kvm_sigset_deactivate(struct kvm_vcpu *vcpu);