On 09.09.2016 21:26, Laine Stump wrote: > In a full domain config, libvirt allows overriding the normal PCI > vs. PCI Express rules when a device address is explicitly provided > (so, e.g., you can force a legacy PCI device to plug into a PCIe port, > although libvirt would never do that on its own). However, due to a > bug libvirt doesn't give this same leeway when hotplugging devices. On > top of that, current libvirt assumes that *all* devices are legacy > PCI. The result of all this is that it's impossible to hotplug a > device into a PCIe port, even if you manually add the PCI address. > > This can all be traced to the function > virDomainPCIAddressEnsureAddr(), and the fact that it calls > virDomainPCIaddressReserveSlot() for manually set addresses, and that > function hardcodes the argument "fromConfig" to false (meaning "this > address was auto-assigned, so it should be subject to stricter > validation"). > > Since virDomainPCIAddressReserveSlot() is just a one line simple > wrapper around virDomainPCIAddressReserveAddr() (adding in a hardcoded > reserveEntireSlot = true and fromConfig = false), all that's needed to > solve the problem with no unwanted side effects is to replace that > call for virDomainPCIAddressReserveSlot() with a direct call to > virDomainPCIAddressReserveAddr(), but with reserveEntireSlot = true, > fromConfig = true. That's what this patch does. > > Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1337490 > --- > src/conf/domain_addr.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c > index 79c024f..93026c2 100644 > --- a/src/conf/domain_addr.c > +++ b/src/conf/domain_addr.c > @@ -507,7 +507,8 @@ virDomainPCIAddressEnsureAddr(virDomainPCIAddressSetPtr addrs, > addrStr, flags, true)) > goto cleanup; > > - ret = virDomainPCIAddressReserveSlot(addrs, &dev->addr.pci, flags); > + ret = virDomainPCIAddressReserveAddr(addrs, &dev->addr.pci, flags, > + true, true); > } else { > ret = virDomainPCIAddressReserveNextSlot(addrs, dev, flags); > } > ACK Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list