vfio/pci: Use pci_try_reset_function() on initial open
authorAlex Williamson <alex.williamson@redhat.com>
Wed, 26 Jul 2017 20:33:15 +0000 (14:33 -0600)
committerAlex Williamson <alex.williamson@redhat.com>
Wed, 26 Jul 2017 20:33:15 +0000 (14:33 -0600)
commit9f47803503247c9ec414072c0724073a1c8c3433
treed0fb9cdb6f4864c8890b68b550564d98a74e224b
parentbb67b496c338e15813f075f482067da930f52e39
vfio/pci: Use pci_try_reset_function() on initial open

Device lock bites again; if a device .remove() callback races a user
calling ioctl(VFIO_GROUP_GET_DEVICE_FD), the unbind request will hold
the device lock, but the user ioctl may have already taken a vfio_device
reference.  In the case of a PCI device, the initial open will attempt
to reset the device, which again attempts to get the device lock,
resulting in deadlock.  Use the trylock PCI reset interface and return
error on the open path if reset fails due to lock contention.

Link: https://lkml.org/lkml/2017/7/25/381
Reported-by: Wen Congyang <wencongyang2@huawei.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/pci/vfio_pci.c