[libvirt] [PATCH v3 3/8] conf: eliminate repetitive code in virDomainPCIAddressGetNextSlot()

Andrea Bolognani abologna at redhat.com
Tue Dec 20 14:46:57 UTC 2016


On Mon, 2016-12-19 at 10:23 -0500, Laine Stump wrote:
> virDomainPCIAddressGetNextSlot() starts searching from the last
> allocated address and goes to the end of all the buses, then goes back
> to the first bus and searchs from there up to the starting point (in

s/searchs/searches/

[...]
> +static int
> +virDomainPCIAddressFindUnusedFunctionOnBus(virDomainPCIAddressBusPtr bus,
> +                                           virPCIDeviceAddressPtr searchAddr,
> +                                           int function ATTRIBUTE_UNUSED,
> +                                           virDomainPCIConnectFlags flags,
> +                                           bool *found)

Having some documentation for the function, especially
what parts of @searchAddr are inspected and updated, and
how @function is used - not at all right now, but that's
going to change later in the series - would be great.


Incidentally, and not relevant to this series, passing
around partially filled-in virPCIDeviceAddress instances
*and* some of the same data on the side sucks big time.

I wonder if the whole thing could be improved by changing
the struct members to to signed and having

  #define VIR_PCI_DEVICE_ADDRESS_UNDEFINED -1

or leave them as it is and use

  #define VIR_PCI_DEVICE_ADDRESS_UNDEFINED UINT_MAX

instead. Either way, we'd have a way to tell whether each
of the components has been initialized or is in need of a
value without having to pass data out-of-band.

> +{
> +    int ret = -1;
> +    char *addrStr = NULL;
> +
> +    *found = false;
> +
> +    if (!(addrStr = virDomainPCIAddressAsString(searchAddr)))
> +        goto cleanup;
> +
> +    if (!virDomainPCIAddressFlagsCompatible(searchAddr, addrStr, bus->flags,
> +                                            flags, false, false)) {
> +        VIR_DEBUG("PCI bus %.4x:%.2x is not compatible with the device",
> +                  searchAddr->domain, searchAddr->bus);
> +    } else {
> +        while (searchAddr->slot <= bus->maxSlot) {
> +            if (bus->slot[searchAddr->slot].functions == 0) {
> +                *found = true;
> +                break;
> +            }
> +
> +            VIR_DEBUG("PCI slot %.4x:%.2x:%.2x already in use",
> +                      searchAddr->domain, searchAddr->bus, searchAddr->slot);
> +            searchAddr->slot++;
> +        }
> +    }
> +
> +    ret = 0;

Empty line here.

> + cleanup:
> +    VIR_FREE(addrStr);
> +    return ret;
> +}


ACK

-- 
Andrea Bolognani / Red Hat / Virtualization




More information about the libvir-list mailing list