
On Tue, 2016-09-20 at 15:14 -0400, Laine Stump wrote:
Before now, all the qemu hotplug functions assumed that all devices to be hotplugged were legacy PCI endpoint devices (VIR_PCI_CONNECT_TYPE_PCI_DEVICE). This worked out "okay", because all devices *are* legacy PCI endpoint devices on x86/440fx machinetypes, and hotplug didn't work properly on machinetypes using PCIe anyway (hotplugging onto a legacy PCI slot doesn't work, and until commit b87703cf any attempt to manually specify a PCIe address for a hotplugged device would be erroneously rejected). This patch makes all qemu hotplug operations honor the pciConnectFlags set by the single all-knowing function qemuDomainDeviceConnectFlagsInternal().
[...]
@@ -485,17 +485,17 @@ virDomainPCIAddressReserveSlot(virDomainPCIAddressSetPtr addrs, int virDomainPCIAddressEnsureAddr(virDomainPCIAddressSetPtr addrs, - virDomainDeviceInfoPtr dev) + virDomainDeviceInfoPtr dev, + virDomainPCIConnectFlags flags) { int ret = -1; char *addrStr = NULL; - /* Flags should be set according to the particular device, - * but only the caller knows the type of device. Currently this - * function is only used for hot-plug, though, and hot-plug is - * only supported for standard PCI devices, so we can safely use - * the setting below */ - virDomainPCIConnectFlags flags = (VIR_PCI_CONNECT_HOTPLUGGABLE | - VIR_PCI_CONNECT_TYPE_PCI_DEVICE); + + /* if pciConnectFlags is 0, the particular model of this device
s/pciConnectFlags/flags/ [...]
@@ -2032,6 +2032,33 @@ qemuDomainAssignAddresses(virDomainDefPtr def, return 0; } +/** + * qemuDomainEnsurePCIAddress: + * + * if @dev should have a PCI address but doesn't, assign + * an address on a compatible PCI bus. Validate that any + * existing address is on a compatible bus. + * + * @obj: the virDomainObjPtr for the domain. This will include + * qemuCaps and address cache (if there is one) + * + * @dev: the device that we need to ensure has a PCI address + * + * returns 0 on success (and any new address set in dev->...info) -1 + * on failure.
The new address is set, not returned, so that information doesn't belong in this section. The description already mention the fact that an address will be assigned if needed anyway. [...]
@@ -1584,10 +1590,12 @@ qemuDomainChrRemove(virDomainDefPtr vmdef, } static int -qemuDomainAttachChrDeviceAssignAddr(virDomainDefPtr def, +qemuDomainAttachChrDeviceAssignAddr(virDomainObjPtr vm, qemuDomainObjPrivatePtr priv,
Please change the type of the first argument from virDomainDefPtr to virDomainObjPtr in a separate commit, and use that chance to remove the qemuDomainObjPrivatePtr argument altogether - you can retrieve it from @vm the same way you already retrieve the DomainDef. ACK -- Andrea Bolognani / Red Hat / Virtualization