Commit 4438355e authored by Paul Durrant's avatar Paul Durrant Committed by Sean Christopherson

KVM: x86/xen: mark guest pages dirty with the pfncache lock held

Sampling gpa and memslot from an unlocked pfncache may yield inconsistent
values so, since there is no problem with calling mark_page_dirty_in_slot()
with the pfncache lock held, relocate the calls in
kvm_xen_update_runstate_guest() and kvm_xen_inject_pending_events()
accordingly.
Signed-off-by: default avatarPaul Durrant <pdurrant@amazon.com>
Reviewed-by: default avatarDavid Woodhouse <dwmw@amazon.co.uk>
Link: https://lore.kernel.org/r/20240215152916.1158-4-paul@xen.orgSigned-off-by: default avatarSean Christopherson <seanjc@google.com>
parent 41496fff
...@@ -452,14 +452,13 @@ static void kvm_xen_update_runstate_guest(struct kvm_vcpu *v, bool atomic) ...@@ -452,14 +452,13 @@ static void kvm_xen_update_runstate_guest(struct kvm_vcpu *v, bool atomic)
smp_wmb(); smp_wmb();
} }
if (user_len2) if (user_len2) {
mark_page_dirty_in_slot(v->kvm, gpc2->memslot, gpc2->gpa >> PAGE_SHIFT);
read_unlock(&gpc2->lock); read_unlock(&gpc2->lock);
}
read_unlock_irqrestore(&gpc1->lock, flags);
mark_page_dirty_in_slot(v->kvm, gpc1->memslot, gpc1->gpa >> PAGE_SHIFT); mark_page_dirty_in_slot(v->kvm, gpc1->memslot, gpc1->gpa >> PAGE_SHIFT);
if (user_len2) read_unlock_irqrestore(&gpc1->lock, flags);
mark_page_dirty_in_slot(v->kvm, gpc2->memslot, gpc2->gpa >> PAGE_SHIFT);
} }
void kvm_xen_update_runstate(struct kvm_vcpu *v, int state) void kvm_xen_update_runstate(struct kvm_vcpu *v, int state)
...@@ -565,13 +564,13 @@ void kvm_xen_inject_pending_events(struct kvm_vcpu *v) ...@@ -565,13 +564,13 @@ void kvm_xen_inject_pending_events(struct kvm_vcpu *v)
: "0" (evtchn_pending_sel32)); : "0" (evtchn_pending_sel32));
WRITE_ONCE(vi->evtchn_upcall_pending, 1); WRITE_ONCE(vi->evtchn_upcall_pending, 1);
} }
mark_page_dirty_in_slot(v->kvm, gpc->memslot, gpc->gpa >> PAGE_SHIFT);
read_unlock_irqrestore(&gpc->lock, flags); read_unlock_irqrestore(&gpc->lock, flags);
/* For the per-vCPU lapic vector, deliver it as MSI. */ /* For the per-vCPU lapic vector, deliver it as MSI. */
if (v->arch.xen.upcall_vector) if (v->arch.xen.upcall_vector)
kvm_xen_inject_vcpu_vector(v); kvm_xen_inject_vcpu_vector(v);
mark_page_dirty_in_slot(v->kvm, gpc->memslot, gpc->gpa >> PAGE_SHIFT);
} }
int __kvm_xen_has_interrupt(struct kvm_vcpu *v) int __kvm_xen_has_interrupt(struct kvm_vcpu *v)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment