vfio-pci: Release devices with BusMaster disabled
authorAlex Williamson <alex.williamson@redhat.com>
Thu, 7 Aug 2014 17:12:02 +0000 (11:12 -0600)
committerAlex Williamson <alex.williamson@redhat.com>
Thu, 7 Aug 2014 17:12:02 +0000 (11:12 -0600)
commit9c22e660ce8105debb497933b9900eaeb40836d2
tree13850f3a51755be42a6b68a03ef6f6b6cab2290b
parent7f0d32e0c1a7a23216a0f2694ec841f60e9dddfd
vfio-pci: Release devices with BusMaster disabled

Our current open/release path looks like this:

vfio_pci_open
  vfio_pci_enable
    pci_enable_device
    pci_save_state
    pci_store_saved_state

vfio_pci_release
  vfio_pci_disable
    pci_disable_device
    pci_restore_state

pci_enable_device() doesn't modify PCI_COMMAND_MASTER, so if a device
comes to us with it enabled, it persists through the open and gets
stored as part of the device saved state.  We then restore that saved
state when released, which can allow the device to attempt to continue
to do DMA.  When the group is disconnected from the domain, this will
get caught by the IOMMU, but if there are other devices in the group,
the device may continue running and interfere with the user.  Even in
the former case, IOMMUs don't necessarily behave well and a stream of
blocked DMA can result in unpleasant behavior on the host.

Explicitly disable Bus Master as we're enabling the device and
slightly re-work release to make sure that pci_disable_device() is
the last thing that touches the device.

Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/pci/vfio_pci.c