[libvirt] [PATCH 03/12] virhostdev: Unify virDomainHostdevDef to virPCIDevice translation
Daniel Henrique Barboza
danielhb413 at gmail.com
Tue Aug 20 17:40:24 UTC 2019
On 8/20/19 11:30 AM, Michal Privoznik wrote:
> There are two places where we need to create virPCIDevice from
> given virDomainHostdevDef. In both places the code is duplicated.
> Move them into a single function and call it from those two
> places.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
Reviewed-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
Tested-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
> src/util/virhostdev.c | 93 +++++++++++++++++++++++++------------------
> 1 file changed, 54 insertions(+), 39 deletions(-)
>
> diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
> index 6861b8a84e..e3f48a9a2e 100644
> --- a/src/util/virhostdev.c
> +++ b/src/util/virhostdev.c
> @@ -212,6 +212,51 @@ virHostdevManagerGetDefault(void)
> return virObjectRef(manager);
> }
>
> +/**
> + * virHostdevGetPCIHostDevice:
> + * @hostdev: domain hostdev definition
> + * @pci: returned PCI device
> + *
> + * For given @hostdev which represents a PCI device construct its
> + * virPCIDevice representation and returned it in @pci. If
> + * @hostdev does not represent a PCI device then @pci is set to
> + * NULL and 0 is returned.
> + *
> + * Returns: 0 on success (@pci might be NULL though),
> + * -1 otherwise (with error reported).
> + */
> +static int
> +virHostdevGetPCIHostDevice(const virDomainHostdevDef *hostdev,
> + virPCIDevicePtr *pci)
> +{
> + VIR_AUTOPTR(virPCIDevice) actual = NULL;
> + const virDomainHostdevSubsysPCI *pcisrc = &hostdev->source.subsys.u.pci;
> +
> + *pci = NULL;
> +
> + if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
> + hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
> + return 0;
> +
> + actual = virPCIDeviceNew(pcisrc->addr.domain, pcisrc->addr.bus,
> + pcisrc->addr.slot, pcisrc->addr.function);
> +
> + if (!actual)
> + return -1;
> +
> + virPCIDeviceSetManaged(actual, hostdev->managed);
> +
> + if (pcisrc->backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO)
> + virPCIDeviceSetStubDriver(actual, VIR_PCI_STUB_DRIVER_VFIO);
> + else if (pcisrc->backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN)
> + virPCIDeviceSetStubDriver(actual, VIR_PCI_STUB_DRIVER_XEN);
> + else
> + virPCIDeviceSetStubDriver(actual, VIR_PCI_STUB_DRIVER_KVM);
> +
> + VIR_STEAL_PTR(*pci, actual);
> + return 0;
> +}
> +
> static virPCIDeviceListPtr
> virHostdevGetPCIHostDeviceList(virDomainHostdevDefPtr *hostdevs, int nhostdevs)
> {
> @@ -223,27 +268,13 @@ virHostdevGetPCIHostDeviceList(virDomainHostdevDefPtr *hostdevs, int nhostdevs)
>
> for (i = 0; i < nhostdevs; i++) {
> virDomainHostdevDefPtr hostdev = hostdevs[i];
> - virDomainHostdevSubsysPCIPtr pcisrc = &hostdev->source.subsys.u.pci;
> VIR_AUTOPTR(virPCIDevice) pci = NULL;
>
> - if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
> - continue;
> - if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
> - continue;
> + if (virHostdevGetPCIHostDevice(hostdev, &pci) < 0)
> + return NULL;
>
> - pci = virPCIDeviceNew(pcisrc->addr.domain, pcisrc->addr.bus,
> - pcisrc->addr.slot, pcisrc->addr.function);
> if (!pci)
> - return NULL;
> -
> - virPCIDeviceSetManaged(pci, hostdev->managed);
> -
> - if (pcisrc->backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO)
> - virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_VFIO);
> - else if (pcisrc->backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN)
> - virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_XEN);
> - else
> - virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_KVM);
> + continue;
>
> if (virPCIDeviceListAdd(pcidevs, pci) < 0)
> return NULL;
> @@ -253,7 +284,6 @@ virHostdevGetPCIHostDeviceList(virDomainHostdevDefPtr *hostdevs, int nhostdevs)
> VIR_RETURN_PTR(pcidevs);
> }
>
> -
> static int
> virHostdevPCISysfsPath(virDomainHostdevDefPtr hostdev,
> char **sysfs_path)
> @@ -1067,7 +1097,6 @@ virHostdevUpdateActivePCIDevices(virHostdevManagerPtr mgr,
> const char *drv_name,
> const char *dom_name)
> {
> - virDomainHostdevDefPtr hostdev = NULL;
> size_t i;
> int ret = -1;
>
> @@ -1078,32 +1107,18 @@ virHostdevUpdateActivePCIDevices(virHostdevManagerPtr mgr,
> virObjectLock(mgr->inactivePCIHostdevs);
>
> for (i = 0; i < nhostdevs; i++) {
> + const virDomainHostdevDef *hostdev = hostdevs[i];
> VIR_AUTOPTR(virPCIDevice) actual = NULL;
> - virDomainHostdevSubsysPCIPtr pcisrc;
> - hostdev = hostdevs[i];
> - pcisrc = &hostdev->source.subsys.u.pci;
>
> - if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
> - continue;
> - if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
> - continue;
> -
> - actual = virPCIDeviceNew(pcisrc->addr.domain, pcisrc->addr.bus,
> - pcisrc->addr.slot, pcisrc->addr.function);
> + if (virHostdevGetPCIHostDevice(hostdev, &actual) < 0)
> + goto cleanup;
>
> if (!actual)
> + continue;
> +
> + if (virPCIDeviceSetUsedBy(actual, drv_name, dom_name) < 0)
> goto cleanup;
>
> - virPCIDeviceSetManaged(actual, hostdev->managed);
> - virPCIDeviceSetUsedBy(actual, drv_name, dom_name);
> -
> - if (pcisrc->backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO)
> - virPCIDeviceSetStubDriver(actual, VIR_PCI_STUB_DRIVER_VFIO);
> - else if (pcisrc->backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN)
> - virPCIDeviceSetStubDriver(actual, VIR_PCI_STUB_DRIVER_XEN);
> - else
> - virPCIDeviceSetStubDriver(actual, VIR_PCI_STUB_DRIVER_KVM);
> -
> /* Setup the original states for the PCI device */
> virPCIDeviceSetUnbindFromStub(actual, hostdev->origstates.states.pci.unbind_from_stub);
> virPCIDeviceSetRemoveSlot(actual, hostdev->origstates.states.pci.remove_slot);
More information about the libvir-list
mailing list