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@xxxxxxxx> > --- > 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list