[libvirt] [PATCH v3 7/8] conf: aggregate multiple devices on a slot when assigning PCI addresses

Andrea Bolognani abologna at redhat.com
Tue Dec 20 15:43:29 UTC 2016


On Mon, 2016-12-19 at 10:23 -0500, Laine Stump wrote:
> If a PCI device has VIR_PCI_CONNECT_AGGREGATE_SLOT set in its
> pciConnectFlags, then during address assignment we allow multiple
> instances of this type of device to be auto-assigned to multiple
> functions on the same device. A slot is used for aggregating multiple
> devices only if the first device assigned to that slot had
> VIR_PCI_CONNECT_AGGREGATE_SLOT set. but any device types that have
> AGGREGATE_SLOT set might be mix/matched on the same slot.

[...]
> @@ -717,6 +729,33 @@ virDomainPCIAddressFindUnusedFunctionOnBus(virDomainPCIAddressBusPtr bus,
>                  break;
>              }
>  
> +            if (flags & VIR_PCI_CONNECT_AGGREGATE_SLOT &&
> +                bus->slot[searchAddr->slot].aggregate) {
> +                /* slot and device are okay with aggregating devices */
> +                if ((bus->slot[searchAddr->slot].functions &
> +                     (1 << searchAddr->function)) == 0) {
> +                    *found = true;
> +                    break;
> +                }
> +
> +                /* also check for *any* unused function if caller
> +                 * sent function = -1
> +                 */
> +                if (function == -1) {
> +                    while (searchAddr->function < 8) {

We know this works because virDomainPCIAddressGetNextSlot()
will set 'searchAddr->function = 0' when 'function == -1',
but I'd rather see...

> +                        if ((bus->slot[searchAddr->slot].functions &
> +                             (1 << searchAddr->function)) == 0) {
> +                            *found = true;
> +                            break; /* out of inner while */
> +                        }
> +                        searchAddr->function++;
> +                    }
> +                    if (*found)
> +                       break; /* out of outer while */
> +                    searchAddr->function = 0; /* reset for next try */

... this line moved right before the while() loop to get
rid of that dependency entirely.


ACK with that changed.

-- 
Andrea Bolognani / Red Hat / Virtualization




More information about the libvir-list mailing list