summaryrefslogtreecommitdiffstats
path: root/drivers/vfio/pci/vfio_pci.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2013-08-09 10:49:58 +0200
committerJan Kara <jack@suse.cz>2013-08-09 10:49:58 +0200
commit97a2847d064e2fdd2e3cd4ff14cad2f377f0677a (patch)
treee49ce105dc6febc25dc3ceba6070ea3998c7330c /drivers/vfio/pci/vfio_pci.c
parente99a03c6f50a699d63b5751e3e88f84e43b037a7 (diff)
parentd2d0395fd1778d4bf714adc5bfd23a5d748d7802 (diff)
downloadtalos-op-linux-97a2847d064e2fdd2e3cd4ff14cad2f377f0677a.tar.gz
talos-op-linux-97a2847d064e2fdd2e3cd4ff14cad2f377f0677a.zip
Merge branch 'for-3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/jeffm/linux-reiserfs into for_next_testing
Reiserfs locking fixes.
Diffstat (limited to 'drivers/vfio/pci/vfio_pci.c')
-rw-r--r--drivers/vfio/pci/vfio_pci.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
index c5179e269df6..cef6002acbd4 100644
--- a/drivers/vfio/pci/vfio_pci.c
+++ b/drivers/vfio/pci/vfio_pci.c
@@ -137,8 +137,27 @@ static void vfio_pci_disable(struct vfio_pci_device *vdev)
*/
pci_write_config_word(pdev, PCI_COMMAND, PCI_COMMAND_INTX_DISABLE);
- if (vdev->reset_works)
- __pci_reset_function(pdev);
+ /*
+ * Careful, device_lock may already be held. This is the case if
+ * a driver unbind is blocked. Try to get the locks ourselves to
+ * prevent a deadlock.
+ */
+ if (vdev->reset_works) {
+ bool reset_done = false;
+
+ if (pci_cfg_access_trylock(pdev)) {
+ if (device_trylock(&pdev->dev)) {
+ __pci_reset_function_locked(pdev);
+ reset_done = true;
+ device_unlock(&pdev->dev);
+ }
+ pci_cfg_access_unlock(pdev);
+ }
+
+ if (!reset_done)
+ pr_warn("%s: Unable to acquire locks for reset of %s\n",
+ __func__, dev_name(&pdev->dev));
+ }
pci_restore_state(pdev);
}
OpenPOWER on IntegriCloud