[libvirt] [PATCH] conf: allow hotplugging "legacy PCI" device to manually addressed PCIe slot
Michal Privoznik
mprivozn at redhat.com
Mon Sep 12 08:04:41 UTC 2016
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
More information about the libvir-list
mailing list