[libvirt] [PATCH 1/2] conf: new function virDomainPCIAddressSetAllMulti()

Andrea Bolognani abologna at redhat.com
Tue Jan 10 10:42:04 UTC 2017


On Tue, 2017-01-10 at 03:23 -0500, Laine Stump wrote:
> This utility function looks through a virPCIAddressSet for any slot of
> any bus that has multiple functions in use, and sets the "multi" flag
> in the virDomainDeviceInfo for the device that is assigned to function
> 0 of that slot (as long as it hasn't already been set explicitly by
> someone who presumably has better information than we do).
> 
> It isn't yet called from anywhere, so will have no functional effect.

[...]
> +static int
> +virDomainPCIAddressSetMultiIter(virDomainDefPtr def ATTRIBUTE_UNUSED,
> +                                virDomainDeviceDefPtr dev ATTRIBUTE_UNUSED,
> +                                virDomainDeviceInfoPtr info,
> +                                void *data)

virDomainPCIAddressSetAllMultiIter()?

Or not :)

[...]
> +/**
> + * virDomainPCIAddressSetAllMulti():
> + *
> + * @def: the domain definition whose devices may need adjusting
> + * @addrs: address set keeping track of all addresses in use.
> + *
> + * Look for any PCI slots that have multiple functions assigned, and
> + * set multi to YES in the address for the device at function 0

s/YES/ON/

> + * (unless it has been explicitly set to NO).

s/NO/OFF/

> + *
> + * No return code, since there is no possibility of failure.
> + */
> +void
> +virDomainPCIAddressSetAllMulti(virDomainDefPtr def,
> +                               virDomainPCIAddressSetPtr addrs)

I also just realized that virDomainPCIAddressSetAllMulti()
might be mistaken for vir::DomainPCIAddressSet::AllMulti()
instead of vir::Domain::PCIAddressSetAllMulti().

The joys of pretending to use an object-oriented language
when actually all you have is plain old C :)

> +{
> +    /* Scan through all the slots in @addrs looking for any that have
> +     * more than just function 0 marked as in use, then use an
> +     * iterator to find the DeviceInfo that uses function 0 on that
> +     * slot and mark it as multi = YES

s/YES/ON/

> +     */
> +    size_t busIdx, slotIdx;
> +
> +    for (busIdx = 0; busIdx < addrs->nbuses; busIdx++) {
> +        virDomainPCIAddressBusPtr bus = &addrs->buses[busIdx];
> +
> +        for (slotIdx = bus->minSlot; slotIdx <= bus->maxSlot; slotIdx++) {
> +            if (bus->slot[slotIdx].functions > 1) {
> +                virPCIDeviceAddress addr = { .domain = 0,

This doesn't look right. What happens if the multifunction
device is at eg. 0001:00:04.0?

...

Oh, never mind, apparently virDomainPCIAddressSet has no
concept of PCI domains anyways... So that's an existing
limitation - one that I assume we're going to have to
address, especially now that ppc64 guests are going to
want to use *lots* of separate PCI domains.


On the other hand, at the point where you're going to call
this function haven't PCI addresses already been assigned
and stored in @def? Why not iterate over it twice to make
the comparison future-proof? The computational cost would
be the same AFAICT.

-- 
Andrea Bolognani / Red Hat / Virtualization




More information about the libvir-list mailing list