diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index afa997b381443c16f2a5e90e00822424004c08c4..080e2c91aa1bf2e4c9212bd84bfe4c153eda7b53 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -31486,10 +31486,7 @@ virDomainDefHasVFIOHostdev(const virDomainDef *def) size_t i; for (i = 0; i < def->nhostdevs; i++) { - const virDomainHostdevDef *tmp = def->hostdevs[i]; - if (tmp->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && - tmp->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI && - tmp->source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) + if (virHostdevIsVFIODevice(def->hostdevs[i])) return true; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 15bfc711f50b42a531603f9e918e9cec75a3282a..6d4c826ff9d62e6da9f829f061fc10ee4b260352 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2112,6 +2112,7 @@ virHostCPUStatsAssign; virHostdevFindUSBDevice; virHostdevIsMdevDevice; virHostdevIsSCSIDevice; +virHostdevIsVFIODevice; virHostdevManagerGetDefault; virHostdevPCINodeDeviceDetach; virHostdevPCINodeDeviceReAttach; diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index e49bb8fb7ec78f9f3bbb810abe7e3562d8d4bc71..b0e1bcab767ec532e2304bc0623698f87b526bee 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -413,9 +413,7 @@ qemuTeardownHostdevCgroup(virDomainObjPtr vm, if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_DEVICES)) return 0; - if (dev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && - dev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI && - dev->source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO && + if (virHostdevIsVFIODevice(dev) && qemuDomainGetHostdevPath(vm->def, dev, true, &npaths, &path, NULL) < 0) goto cleanup; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 9b201a8259977ba797e6ae752eb391bc3ed6a04b..997c35c951a9e18a43245659efabcb3b02183538 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -11761,9 +11761,7 @@ getPPC64MemLockLimitBytes(virDomainDefPtr def) for (i = 0; i < def->nhostdevs; i++) { virDomainHostdevDefPtr dev = def->hostdevs[i]; - if (dev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && - dev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI && - dev->source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) { + if (virHostdevIsVFIODevice(dev)) { usesVFIO = true; pciAddr = &dev->source.subsys.u.pci.addr; @@ -11915,12 +11913,8 @@ qemuDomainGetMemLockLimitBytes(virDomainDefPtr def) * Note that this may not be valid for all platforms. */ for (i = 0; i < def->nhostdevs; i++) { - virDomainHostdevSubsysPtr subsys = &def->hostdevs[i]->source.subsys; - - if (def->hostdevs[i]->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && - (subsys->type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV || - (subsys->type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI && - subsys->u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO))) { + if (virHostdevIsVFIODevice(def->hostdevs[i]) || + virHostdevIsMdevDevice(def->hostdevs[i])) { memKB = virDomainDefGetMemoryTotal(def) + 1024 * 1024; goto done; } diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 4da6457bdc93314e5461f9329f3957276888e61b..2d47f7461f934fbcea34de4a87f40d7a0bd8374b 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -4437,16 +4437,10 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver, qemuDomainObjPrivatePtr priv = vm->privateData; g_autofree char *drivealias = NULL; g_autofree char *objAlias = NULL; - bool is_vfio = false; VIR_DEBUG("Removing host device %s from domain %p %s", hostdev->info->alias, vm, vm->def->name); - if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) { - int backend = hostdev->source.subsys.u.pci.backend; - is_vfio = backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO; - } - if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) { virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi; virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &scsisrc->u.iscsi; @@ -4494,7 +4488,7 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver, virDomainAuditHostdev(vm, hostdev, "detach", true); - if (!is_vfio && + if (!virHostdevIsVFIODevice(hostdev) && qemuSecurityRestoreHostdevLabel(driver, vm, hostdev) < 0) VIR_WARN("Failed to restore host device labelling"); diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index 475796aae5a376a57aea15ce4e84401bceca4f4f..010eb551a9112112b26af59025e946934c7ec079 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -389,6 +389,21 @@ virHostdevIsMdevDevice(const virDomainHostdevDef *hostdev) } +/** + * virHostdevIsVFIODevice: + * @hostdev: host device to check + * + * Returns true if @hostdev is a PCI device with VFIO backend, false otherwise. + */ +bool +virHostdevIsVFIODevice(const virDomainHostdevDef *hostdev) +{ + return hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && + hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI && + hostdev->source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO; +} + + static int virHostdevNetConfigVirtPortProfile(const char *linkdev, int vf, virNetDevVPortProfilePtr virtPort, diff --git a/src/util/virhostdev.h b/src/util/virhostdev.h index b8269c57bdb0ba4b3a9fd091bdd3b09baebd6923..2d61c21e9dac7435395f539969f67702d117ffbc 100644 --- a/src/util/virhostdev.h +++ b/src/util/virhostdev.h @@ -193,6 +193,9 @@ virHostdevIsSCSIDevice(const virDomainHostdevDef *hostdev) bool virHostdevIsMdevDevice(const virDomainHostdevDef *hostdev) ATTRIBUTE_NONNULL(1); +bool +virHostdevIsVFIODevice(const virDomainHostdevDef *hostdev) + ATTRIBUTE_NONNULL(1); /* functions used by NodeDevDetach/Reattach/Reset */ int virHostdevPCINodeDeviceDetach(virHostdevManagerPtr mgr,