[libvirt] [PATCH v12 04/11] qemu_hostdev: parse BACKEND_DEFAULT outside
Cedric Bosdonnat
cbosdonnat at suse.com
Mon Feb 17 09:38:11 UTC 2014
On Mon, 2014-02-17 at 14:32 +0800, Chunyan Liu wrote:
> For extracting hostdev codes from qemu_hostdev.c to common library, change
> original paring VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT in hostdev function to
> qemuDomainDeviceDefPostParse.
typo: paring -> parsing.
>
> Signed-off-by: Chunyan Liu <cyliu at suse.com>
> ---
> src/qemu/qemu_domain.c | 22 +++++++++++++++
> src/qemu/qemu_hostdev.c | 28 +++-----------------
> src/qemu/qemu_hostdev.h | 2 -
> src/qemu/qemu_hotplug.c | 2 +-
> src/qemu/qemu_process.c | 3 +-
> .../qemuxml2argv-hostdev-pci-address.xml | 1 +
> .../qemuxml2argvdata/qemuxml2argv-net-hostdev.xml | 1 +
> tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml | 2 +
> 8 files changed, 32 insertions(+), 29 deletions(-)
>
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index a665061..55e707e 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -38,6 +38,7 @@
> #include "virtime.h"
> #include "virstoragefile.h"
> #include "virstring.h"
> +#include "qemu_hostdev.h"
>
> #include <sys/time.h>
> #include <fcntl.h>
> @@ -821,6 +822,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
> int ret = -1;
> virQEMUDriverPtr driver = opaque;
> virQEMUDriverConfigPtr cfg = NULL;
> + virQEMUCapsPtr qemuCaps = NULL;
>
> if (dev->type == VIR_DOMAIN_DEVICE_NET &&
> dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
> @@ -899,6 +901,26 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
> dev->data.chr->source.data.nix.listen = true;
> }
>
> + if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
> + virDomainHostdevDefPtr hostdev = dev->data.hostdev;
> + if (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_DEFAULT) {
> +
> + hostdev->source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM;
> + if (driver && driver->qemuCapsCache) {
> + bool supportsPassthroughVFIO = qemuHostdevHostSupportsPassthroughVFIO();
> + qemuCaps = virQEMUCapsCacheLookupCopy(driver->qemuCapsCache,
> + def->emulator);
> + if (supportsPassthroughVFIO && qemuCaps &&
> + virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI))
> + hostdev->source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
> +
> + virObjectUnref(qemuCaps);
> + }
> + }
> + }
> +
> ret = 0;
KVM passthrough support isn't checked here but was checked in the
removed code, is that intended?
> cleanup:
> diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c
> index ce5012d..80552cd 100644
> --- a/src/qemu/qemu_hostdev.c
> +++ b/src/qemu/qemu_hostdev.c
> @@ -583,8 +583,7 @@ qemuHostdevHostSupportsPassthroughLegacy(void)
>
> static bool
> qemuPrepareHostdevPCICheckSupport(virDomainHostdevDefPtr *hostdevs,
> - size_t nhostdevs,
> - virQEMUCapsPtr qemuCaps)
> + size_t nhostdevs)
> {
> bool supportsPassthroughKVM = qemuHostdevHostSupportsPassthroughLegacy();
> bool supportsPassthroughVFIO = qemuHostdevHostSupportsPassthroughVFIO();
> @@ -601,23 +600,6 @@ qemuPrepareHostdevPCICheckSupport(virDomainHostdevDefPtr *hostdevs,
> continue;
>
> switch ((virDomainHostdevSubsysPciBackendType) *backend) {
> - case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT:
> - if (supportsPassthroughVFIO &&
> - virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
> - *backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
> - } else if (supportsPassthroughKVM &&
> - (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCIDEVICE) ||
> - virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) {
> - *backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM;
> - } else {
> - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> - _("host doesn't support passthrough of "
> - "host PCI devices"));
> - return false;
> - }
> -
> - break;
> -
> case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO:
> if (!supportsPassthroughVFIO) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> @@ -635,7 +617,7 @@ qemuPrepareHostdevPCICheckSupport(virDomainHostdevDefPtr *hostdevs,
>
> break;
>
> - case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST:
> + default:
> break;
> }
> }
> @@ -650,7 +632,6 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver,
> const unsigned char *uuid,
> virDomainHostdevDefPtr *hostdevs,
> int nhostdevs,
> - virQEMUCapsPtr qemuCaps,
> unsigned int flags)
> {
> virPCIDeviceListPtr pcidevs = NULL;
> @@ -659,7 +640,7 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver,
> int ret = -1;
> virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>
> - if (!qemuPrepareHostdevPCICheckSupport(hostdevs, nhostdevs, qemuCaps))
> + if (!qemuPrepareHostdevPCICheckSupport(hostdevs, nhostdevs))
> goto cleanup;
>
> virObjectLock(driver->activePciHostdevs);
> @@ -1189,7 +1170,6 @@ cleanup:
> int
> qemuPrepareHostDevices(virQEMUDriverPtr driver,
> virDomainDefPtr def,
> - virQEMUCapsPtr qemuCaps,
> unsigned int flags)
> {
> if (!def->nhostdevs)
> @@ -1197,7 +1177,7 @@ qemuPrepareHostDevices(virQEMUDriverPtr driver,
>
> if (qemuPrepareHostdevPCIDevices(driver, def->name, def->uuid,
> def->hostdevs, def->nhostdevs,
> - qemuCaps, flags) < 0)
> + flags) < 0)
> return -1;
>
> if (qemuPrepareHostUSBDevices(driver, def, flags) < 0)
> diff --git a/src/qemu/qemu_hostdev.h b/src/qemu/qemu_hostdev.h
> index 710867d..128032d 100644
> --- a/src/qemu/qemu_hostdev.h
> +++ b/src/qemu/qemu_hostdev.h
> @@ -45,7 +45,6 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver,
> const unsigned char *uuid,
> virDomainHostdevDefPtr *hostdevs,
> int nhostdevs,
> - virQEMUCapsPtr qemuCaps,
> unsigned int flags);
> int qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev,
> bool mandatory,
> @@ -59,7 +58,6 @@ int qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver,
> int nhostdevs);
> int qemuPrepareHostDevices(virQEMUDriverPtr driver,
> virDomainDefPtr def,
> - virQEMUCapsPtr qemuCaps,
> unsigned int flags);
> void qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver,
> const char *name,
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index c47c5e8..8486f25 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -1163,7 +1163,7 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver,
> if (!cfg->relaxedACS)
> flags |= VIR_STRICT_ACS_CHECK;
> if (qemuPrepareHostdevPCIDevices(driver, vm->def->name, vm->def->uuid,
> - &hostdev, 1, priv->qemuCaps, flags) < 0)
> + &hostdev, 1, flags) < 0)
> return -1;
>
> /* this could have been changed by qemuPrepareHostdevPCIDevices */
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index f1fe35e..e938649 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -3690,8 +3690,7 @@ int qemuProcessStart(virConnectPtr conn,
> hostdev_flags |= VIR_STRICT_ACS_CHECK;
> if (!migrateFrom)
> hostdev_flags |= VIR_COLD_BOOT;
> - if (qemuPrepareHostDevices(driver, vm->def, priv->qemuCaps,
> - hostdev_flags) < 0)
> + if (qemuPrepareHostDevices(driver, vm->def, hostdev_flags) < 0)
> goto cleanup;
>
> VIR_DEBUG("Preparing chr devices");
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml
> index 422127c..b9a221a 100644
> --- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml
> @@ -24,6 +24,7 @@
> <controller type='ide' index='0'/>
> <controller type='pci' index='0' model='pci-root'/>
> <hostdev mode='subsystem' type='pci' managed='yes'>
> + <driver name='kvm'/>
> <source>
> <address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/>
> </source>
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml
> index d65ef87..9e79348 100644
> --- a/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml
> @@ -24,6 +24,7 @@
> <controller type='pci' index='0' model='pci-root'/>
> <interface type='hostdev' managed='yes'>
> <mac address='00:11:22:33:44:55'/>
> + <driver name='kvm'/>
> <source>
> <address type='pci' domain='0x0002' bus='0x03' slot='0x07' function='0x1'/>
> </source>
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml b/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml
> index a5e59b2..924842b 100644
> --- a/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml
> @@ -33,12 +33,14 @@
> <rom file='/etc/fake/bootrom.bin'/>
> </interface>
> <hostdev mode='subsystem' type='pci' managed='yes'>
> + <driver name='kvm'/>
> <source>
> <address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/>
> </source>
> <rom bar='off'/>
> </hostdev>
> <hostdev mode='subsystem' type='pci' managed='yes'>
> + <driver name='kvm'/>
> <source>
> <address domain='0x0000' bus='0x06' slot='0x12' function='0x6'/>
> </source>
Can't those hostdev definitions keep the default backend like before?
--
Cedric
More information about the libvir-list
mailing list