• David Woodhouse's avatar
    KVM: x86/xen: fix recursive deadlock in timer injection · 7a36d680
    David Woodhouse authored
    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 #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: 77c9b9de ("KVM: x86/xen: Use fast path for Xen timer delivery")
    Signed-off-by: default avatarDavid Woodhouse <dwmw@amazon.co.uk>
    Reviewed-by: default avatarPaul Durrant <paul@xen.org>
    Link: https://lore.kernel.org/r/20240227115648.3104-6-dwmw2@infradead.orgSigned-off-by: default avatarSean Christopherson <seanjc@google.com>
    7a36d680
xen.c 63.1 KB