[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