[libvirt] [PATCH 00/10] VFIO fixes for PCI devices

Andrea Bolognani abologna at redhat.com
Wed Dec 2 17:17:47 UTC 2015


This series is my attempt at fixing

  https://bugzilla.redhat.com/show_bug.cgi?id=1272300

In its current state, it's missing test cases covering the new
functionality[1] and it's known not to handle properly one
situation[2], but I'd like to get some feedback on my current
work and now that I have something to show for it feels like
a good time.

I'm already working on the missing bits and they will either
be included in the next revision or sent as separate series
later on.

The problem being solved is that, when using VFIO, IOMMU group
ownership can't be shared, eg. two devices that are in the
same IOMMU group can't be assigned to different guests, or to
the host and a guest. If that happens, the host will probably
crash.

The series deals with this issue by making sure safety
conditions are met before detaching devices from the host or
reattaching them to the host. In praticular, when we're asked
to reattach a device to the host but doing so would lead to
sharing IOMMU group ownership, we delay the operation until
we can guarantee this will not cause problems. As a nice side
effect of the changes we check for this when starting a guest
too, instead of assuming it will work and having QEMU error
out immediately afterwards.

Patches are organized as follows:

  1-2: Minor cleanups that make implicit / confusing stuff
       explicit / less confusing
    3: Convert a string field used as an enumeration to a
       proper enumeration
    4: Introduce a simple helper function used later on
  5-6: Rewrite the checks used when detaching devices from
       the host. With this patches applied, the behaviour
       is basically the same as before, except for the nice
       little extra detailed above
  7-9: Implement the delay when reattaching devices to the
       host, thus preventing the crash and fixing the bug
   10: Spit and polish

Cheers.


[1] Luckily, it doesn't break the existing tests either
[2] If you call 'virsh nodedev-reattach' on a device that's
    assigned to a guest, libvirt won't stop you and you will
    end up crashing your system

Andrea Bolognani (10):
  pci: Remove redundant parameter from virPCIDeviceBindToStub()
  pci: Remove 'reprobe' parameter from virPCIDeviceUnbind()
  pci: Introduce virPCIStubDriver enumeration
  pci: Introduce virPCIDeviceIOMMUGroupIterate()
  hostdev: Simplify virHostdevIsPCIDeviceUsed()
  hostdev: Check for safety before detaching VFIO devices
  hostdev: Delay reattach of VFIO devices
  hostdev: Clean up delayed VFIO devices
  hostdev: Devices have already been marked as inactive
  hostdev: Tidy up after changes to VFIO device handling

 src/libvirt_private.syms |   3 +
 src/libxl/libxl_driver.c |   3 +-
 src/qemu/qemu_driver.c   |   6 +-
 src/util/virhostdev.c    | 410 ++++++++++++++++++++++++++++++++++-------------
 src/util/virpci.c        | 125 +++++++++------
 src/util/virpci.h        |  26 ++-
 src/xen/xen_driver.c     |   3 +-
 tests/virhostdevtest.c   |   5 +-
 tests/virpcitest.c       |  35 ++--
 9 files changed, 427 insertions(+), 189 deletions(-)

-- 
2.5.0




More information about the libvir-list mailing list