1. 08 10月, 2012 4 次提交
    • A
      vfio-pci: Rework MSIX setup/teardown · fd704adc
      Alex Williamson 提交于
      We try to do lazy initialization of MSIX since we don't actually need
      to setup anything until MSIX vectors start getting used.  This leads
      to problems if MSIX is enabled, but never used (we can end up trying
      to re-enable INTx while it's still enabled).  We also run into
      problems trying to expand our reset function to tear down interrupts
      as we can then get vector release notifications after we've released
      data structures.  By making explicit initialization and teardown we
      can avoid both of these problems and behave more similar to bare
      metal.
      Signed-off-by: NAlex Williamson <alex.williamson@redhat.com>
      fd704adc
    • A
      vfio-pci: Unmap and retry DMA mapping · 12af1344
      Alex Williamson 提交于
      Occasionally we get regions added that overlap with existing mappings.
      These always seems to be in the VGA ROM range.  VFIO returns EBUSY
      for these mapping attempts.  We can try a little harder and assume
      that the latest mapping is correct by removing any overlapping ranges
      and retrying the original request.
      Signed-off-by: NAlex Williamson <alex.williamson@redhat.com>
      12af1344
    • A
      vfio-pci: Re-order map/unmap · af6bc27e
      Alex Williamson 提交于
      This cleans up the next patch that calls unmap from map.
      Signed-off-by: NAlex Williamson <alex.williamson@redhat.com>
      af6bc27e
    • A
      vfio-pci: Update slow path INTx algorithm · ea486926
      Alex Williamson 提交于
      We can't afford the overhead of switching out and back into mmap mode
      around each interrupt, but we can do it lazily via a timer.  On INTx
      interrupt, disable the mmap'd memory regions and set a timer.  On
      every interrupt, push the timer out.  If the timer expires and the
      interrupt is no longer pending, switch back to mmap mode.
      
      This has the benefit that things like graphics cards, which rarely or
      never, fire an interrupt don't need manual user intervention to add
      the x-intx=off parameter.  They'll just remain in mmap mode until they
      trigger an interrupt, and if they don't continue to regularly fire
      interrupts, they'll switch back.
      
      The default timeout is tuned for network cards so that a ping is just
      enough to keep them in non-mmap mode, where they have much better
      latency.  It is tunable with an experimental option,
      x-intx-mmap-timeout-ms.  A value of 0 keeps the device in non-mmap
      mode after the first interrupt.
      
      It's possible we could look at the class code of devices and come up
      with reasonable per-class defaults based on expected interrupt
      frequency and latency.  None of this is used for MSI interrupts and
      also won't be used if we can bypass through KVM.
      Signed-off-by: NAlex Williamson <alex.williamson@redhat.com>
      ea486926
  2. 02 10月, 2012 1 次提交
  3. 01 10月, 2012 1 次提交
    • A
      vfio: vfio-pci device assignment driver · 65501a74
      Alex Williamson 提交于
      This adds the core of the QEMU VFIO-based PCI device assignment driver.
      To make use of this driver, enable CONFIG_VFIO, CONFIG_VFIO_IOMMU_TYPE1,
      and CONFIG_VFIO_PCI in your host Linux kernel config.  Load the vfio-pci
      module.  To assign device 0000:05:00.0 to a guest, do the following:
      
      for dev in $(ls /sys/bus/pci/devices/0000:05:00.0/iommu_group/devices); do
          vendor=$(cat /sys/bus/pci/devices/$dev/vendor)
          device=$(cat /sys/bus/pci/devices/$dev/device)
          if [ -e /sys/bus/pci/devices/$dev/driver ]; then
              echo $dev > /sys/bus/pci/devices/$dev/driver/unbind
          fi
          echo $vendor $device > /sys/bus/pci/drivers/vfio-pci/new_id
      done
      
      See Documentation/vfio.txt in the Linux kernel tree for further
      description of IOMMU groups and VFIO.
      
      Then launch qemu including the option:
      
      -device vfio-pci,host=0000:05:00.0
      
      Legacy PCI interrupts (INTx) currently makes use of a kludge where we
      trap BAR accesses and assume the access is in response to an interrupt,
      therefore de-asserting and unmasking the interrupt.  It's not quite as
      targetted as using the EOI for this, but it's self contained and seems
      to work across all architectures.  The side-effect is a significant
      performance slow-down for device in INTx mode.  Some devices, like
      graphics cards, don't really use their interrupt, so this can be turned
      off with the x-intx=off option, which disables INTx alltogether.  This
      should be considered an experimental option until we refine this code.
      Both MSI and MSI-X are supported and avoid these issues.
      Signed-off-by: NAlex Williamson <alex.williamson@redhat.com>
      Acked-by: NMichael S. Tsirkin <mst@redhat.com>
      Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
      65501a74