• David Woodhouse's avatar
    KVM: x86: Take srcu lock in post_kvm_run_save() · f3d1436d
    David Woodhouse authored
    The Xen interrupt injection for event channels relies on accessing the
    guest's vcpu_info structure in __kvm_xen_has_interrupt(), through a
    gfn_to_hva_cache.
    
    This requires the srcu lock to be held, which is mostly the case except
    for this code path:
    
    [   11.822877] WARNING: suspicious RCU usage
    [   11.822965] -----------------------------
    [   11.823013] include/linux/kvm_host.h:664 suspicious rcu_dereference_check() usage!
    [   11.823131]
    [   11.823131] other info that might help us debug this:
    [   11.823131]
    [   11.823196]
    [   11.823196] rcu_scheduler_active = 2, debug_locks = 1
    [   11.823253] 1 lock held by dom:0/90:
    [   11.823292]  #0: ffff998956ec8118 (&vcpu->mutex){+.+.}, at: kvm_vcpu_ioctl+0x85/0x680
    [   11.823379]
    [   11.823379] stack backtrace:
    [   11.823428] CPU: 2 PID: 90 Comm: dom:0 Kdump: loaded Not tainted 5.4.34+ #5
    [   11.823496] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org 04/01/2014
    [   11.823612] Call Trace:
    [   11.823645]  dump_stack+0x7a/0xa5
    [   11.823681]  lockdep_rcu_suspicious+0xc5/0x100
    [   11.823726]  __kvm_xen_has_interrupt+0x179/0x190
    [   11.823773]  kvm_cpu_has_extint+0x6d/0x90
    [   11.823813]  kvm_cpu_accept_dm_intr+0xd/0x40
    [   11.823853]  kvm_vcpu_ready_for_interrupt_injection+0x20/0x30
                  < post_kvm_run_save() inlined here >
    [   11.823906]  kvm_arch_vcpu_ioctl_run+0x135/0x6a0
    [   11.823947]  kvm_vcpu_ioctl+0x263/0x680
    
    Fixes: 40da8ccd ("KVM: x86/xen: Add event channel interrupt vector upcall")
    Signed-off-by: default avatarDavid Woodhouse <dwmw@amazon.co.uk>
    Cc: stable@vger.kernel.org
    Message-Id: <606aaaf29fca3850a63aa4499826104e77a72346.camel@infradead.org>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    f3d1436d
x86.c 325 KB