Skip to content

Commit 7a36d68

Browse files
dwmw2sean-jc
authored andcommittedMar 5, 2024
KVM: x86/xen: fix recursive deadlock in timer injection
The fast-path timer delivery introduced a recursive locking deadlock when userspace configures a timer which has already expired and is delivered immediately. The call to kvm_xen_inject_timer_irqs() can call to kvm_xen_set_evtchn() which may take kvm->arch.xen.xen_lock, which is already held in kvm_xen_vcpu_get_attr(). ============================================ WARNING: possible recursive locking detected 6.8.0-smp--5e10b4d51d77-drs torvalds#232 Tainted: G O -------------------------------------------- xen_shinfo_test/250013 is trying to acquire lock: ffff938c9930cc30 (&kvm->arch.xen.xen_lock){+.+.}-{3:3}, at: kvm_xen_set_evtchn+0x74/0x170 [kvm] but task is already holding lock: ffff938c9930cc30 (&kvm->arch.xen.xen_lock){+.+.}-{3:3}, at: kvm_xen_vcpu_get_attr+0x38/0x250 [kvm] Now that the gfn_to_pfn_cache has its own self-sufficient locking, its callers no longer need to ensure serialization, so just stop taking kvm->arch.xen.xen_lock from kvm_xen_set_evtchn(). Fixes: 77c9b9d ("KVM: x86/xen: Use fast path for Xen timer delivery") Signed-off-by: David Woodhouse <[email protected]> Reviewed-by: Paul Durrant <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Sean Christopherson <[email protected]>
1 parent 6addfcf commit 7a36d68

File tree

1 file changed

+0
-4
lines changed

1 file changed

+0
-4
lines changed
 

‎arch/x86/kvm/xen.c

-4
Original file line numberDiff line numberDiff line change
@@ -1862,8 +1862,6 @@ static int kvm_xen_set_evtchn(struct kvm_xen_evtchn *xe, struct kvm *kvm)
18621862
mm_borrowed = true;
18631863
}
18641864

1865-
mutex_lock(&kvm->arch.xen.xen_lock);
1866-
18671865
/*
18681866
* It is theoretically possible for the page to be unmapped
18691867
* and the MMU notifier to invalidate the shared_info before
@@ -1891,8 +1889,6 @@ static int kvm_xen_set_evtchn(struct kvm_xen_evtchn *xe, struct kvm *kvm)
18911889
srcu_read_unlock(&kvm->srcu, idx);
18921890
} while(!rc);
18931891

1894-
mutex_unlock(&kvm->arch.xen.xen_lock);
1895-
18961892
if (mm_borrowed)
18971893
kthread_unuse_mm(kvm->mm);
18981894

0 commit comments

Comments
 (0)