[PATCH 00/20] handle AWOL SR-IOV VF hostdevs during domain lifetime

Daniel Henrique Barboza danielhb413 at gmail.com
Fri Jan 15 13:32:50 UTC 2021


Ping

On 1/4/21 9:54 AM, Daniel Henrique Barboza wrote:
> Hi,
> 
> This series is an attempt to fix https://gitlab.com/libvirt/libvirt/-/issues/72.
> 
> The root issue is that, for obvious reasons,  virPCIDeviceNew() requires the
> device to exist in the host (i.e. the config file must be present in sysfs).
> The unexpected absence of the device (e.g. removing the VFs from the host while
> a domain was using them) will make virPCIDeviceNew() return -1 in several
> code paths, and the effects in Libvirt can be bothersome. Patch 20 will
> explain it in greater detail.
> 
> Changing virPCIDeviceNew() internals to not fail in this scenario would
> be a herculean refactor of innocent code that doesn't have anything to
> do with the problem. My approach here is to check if the device exists
> in the sysfs in key places, keeping the default virPCIDeviceNew()
> behavior intact.
> 
> I mentioned this is patch 20 but to emphasize: this is NOT an attempt
> to implement surprise hostdev hotunplug support in Libvirt. Removing
> SR-IOVs VFs used by any domain is still not cool and should be avoided.
> But after this series, Libvirt can at least fall on its feet if this
> situation happens.
> 
> The series was tested using a Mellanox MT28800 card in a Power 9 server.
> 
> Daniel Henrique Barboza (20):
>    virpci, domain_audit: use virPCIDeviceAddressAsString()
>    qemu, lxc: move NodeDeviceGetPCIInfo() function to domain_driver.c
>    domain_driver.c: use PCI address with
>      virDomainDriverNodeDeviceGetPCIInfo()
>    virpci.c: simplify virPCIDeviceNew() signature
>    virpci: introduce virPCIDeviceExists()
>    virhostdev.c: virHostdevGetPCIHostDevice() now reports missing device
>    security_selinux.c: modernize set/restore hostdev subsys label
>      functions
>    security_dac.c: modernize hostdev label set/restore functions
>    dac, selinux: skip setting/restoring label for absent PCI devices
>    libvirt-nodedev.c: remove return value from virNodeDeviceFree()
>    qemu_driver.c: modernize qemuNodeDeviceReAttach()
>    libxl_driver.c: modernize libxlNodeDeviceReAttach()
>    virsh-domain.c: modernize cmdDetachDevice()
>    virhostdev.c: add virHostdevIsPCIDevice() helper
>    qemu_cgroup.c: skip absent PCI devices in qemuTeardownHostdevCgroup()
>    virpci.c: use virPCIDeviceAddressPtr in virPCIDeviceListFindIndex()
>    virpci.c: use virPCIDeviceAddressPtr in virPCIDeviceListFind()
>    virpci.c: use virPCIDeviceAddressPtr in virPCIDeviceListSteal()
>    virpci.c: use virPCIDeviceAddressPtr in virPCIDeviceListDel()
>    virhostdev.c: remove missing PCI devs from hostdev manager
> 
>   include/libvirt/libvirt-nodedev.h  |  2 +-
>   src/conf/domain_audit.c            |  6 +-
>   src/datatypes.h                    |  2 +
>   src/hypervisor/domain_driver.c     | 30 ++++++++++
>   src/hypervisor/domain_driver.h     |  4 ++
>   src/hypervisor/virhostdev.c        | 88 ++++++++++++++++++++++------
>   src/hypervisor/virhostdev.h        |  2 +
>   src/libvirt-nodedev.c              | 15 +++--
>   src/libvirt_private.syms           |  3 +
>   src/libxl/libxl_driver.c           | 87 ++++++++--------------------
>   src/node_device/node_device_udev.c | 11 ++--
>   src/qemu/qemu_cgroup.c             | 10 ++++
>   src/qemu/qemu_domain_address.c     |  5 +-
>   src/qemu/qemu_driver.c             | 81 +++++++-------------------
>   src/security/security_apparmor.c   |  3 +-
>   src/security/security_dac.c        | 61 ++++++++------------
>   src/security/security_selinux.c    | 66 +++++++++------------
>   src/security/virt-aa-helper.c      |  6 +-
>   src/util/virnetdev.c               |  3 +-
>   src/util/virnvme.c                 |  5 +-
>   src/util/virpci.c                  | 93 ++++++++++++++----------------
>   src/util/virpci.h                  | 14 ++---
>   tests/virhostdevtest.c             |  3 +-
>   tests/virpcitest.c                 | 35 ++++++++---
>   tools/virsh-domain.c               | 18 ++----
>   25 files changed, 325 insertions(+), 328 deletions(-)
> 




More information about the libvir-list mailing list