• Paolo Bonzini's avatar
    KVM: x86: pull kvm->srcu read-side to kvm_arch_vcpu_ioctl_run · 8d25b7be
    Paolo Bonzini authored
    kvm_arch_vcpu_ioctl_run is already doing srcu_read_lock/unlock in two
    places, namely vcpu_run and post_kvm_run_save, and a third is actually
    needed around the call to vcpu->arch.complete_userspace_io to avoid
    the following splat:
    
      WARNING: suspicious RCU usage
      arch/x86/kvm/pmu.c:190 suspicious rcu_dereference_check() usage!
      other info that might help us debug this:
      rcu_scheduler_active = 2, debug_locks = 1
      1 lock held by CPU 28/KVM/370841:
      #0: ff11004089f280b8 (&vcpu->mutex){+.+.}-{3:3}, at: kvm_vcpu_ioctl+0x87/0x730 [kvm]
      Call Trace:
       <TASK>
       dump_stack_lvl+0x59/0x73
       reprogram_fixed_counter+0x15d/0x1a0 [kvm]
       kvm_pmu_trigger_event+0x1a3/0x260 [kvm]
       ? free_moved_vector+0x1b4/0x1e0
       complete_fast_pio_in+0x8a/0xd0 [kvm]
    
    This splat is not at all unexpected, since complete_userspace_io callbacks
    can execute similar code to vmexits.  For example, SVM with nrips=false
    will call into the emulator from svm_skip_emulated_instruction().
    
    While it's tempting to never acquire kvm->srcu for an uninitialized vCPU,
    practically speaking there's no penalty to acquiring kvm->srcu "early"
    as the KVM_MP_STATE_UNINITIALIZED path is a one-time thing per vCPU.  On
    the other hand, seemingly innocuous helpers like kvm_apic_accept_events()
    and sync_regs() can theoretically reach code that might access
    SRCU-protected data structures, e.g. sync_regs() can trigger forced
    existing of nested mode via kvm_vcpu_ioctl_x86_set_vcpu_events().
    Reported-by: default avatarLike Xu <likexu@tencent.com>
    Co-developed-by: default avatarSean Christopherson <seanjc@google.com>
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    8d25b7be
x86.c 337 KB