• Yi Liu's avatar
    kvm/vfio: Fix potential deadlock on vfio group_lock · 51cdc8bc
    Yi Liu authored
    Currently it is possible that the final put of a KVM reference comes from
    vfio during its device close operation.  This occurs while the vfio group
    lock is held; however, if the vfio device is still in the kvm device list,
    then the following call chain could result in a deadlock:
    
    VFIO holds group->group_lock/group_rwsem
      -> kvm_put_kvm
       -> kvm_destroy_vm
        -> kvm_destroy_devices
         -> kvm_vfio_destroy
          -> kvm_vfio_file_set_kvm
           -> vfio_file_set_kvm
            -> try to hold group->group_lock/group_rwsem
    
    The key function is the kvm_destroy_devices() which triggers destroy cb
    of kvm_device_ops. It calls back to vfio and try to hold group_lock. So
    if this path doesn't call back to vfio, this dead lock would be fixed.
    Actually, there is a way for it. KVM provides another point to free the
    kvm-vfio device which is the point when the device file descriptor is
    closed. This can be achieved by providing the release cb instead of the
    destroy cb. A...
    51cdc8bc
vfio.c 7.8 KB