[libvirt] [PATCH v3 08/12] conf: Allocate/release 'uid' and 'fid' in PCI address

Andrea Bolognani abologna at redhat.com
Thu Aug 16 16:06:45 UTC 2018


On Tue, 2018-08-07 at 17:10 +0800, Yi Min Zhao wrote:
[...]
> +static inline bool
> +virDeviceInfoPCIAddressExtensionPresent(const virDomainDeviceInfo *info)
> +{
> +    return info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI &&
> +        info->addr.pci.zpci;
> +}

This should be called virDeviceInfoPCIAddressExtensionIsPresent()
since it's a predicate. I know the corresponding PCI function gets
the naming wrong, but that doesn't mean you should too :)

In the same vein, I don't think this (or the PCI version, for that
matter) need to be inline... I'd rather have them both as regular
functions in the .c file. I'll probably cook up a patch cleaning
up the PCI part later, see what the feedback is.

[...]
> +static int
> +virDomainZPCIAddressReserveNextAddr(virDomainZPCIAddressIdsPtr zpciIds,
> +                                    virZPCIDeviceAddressPtr addr)
> +{
> +    if (!addr->uid_assigned &&
> +        virDomainZPCIAddressReserveNextUid(zpciIds->uids, addr)) {
> +            return -1;
> +    }
> +
> +    if (!addr->fid_assigned &&
> +        virDomainZPCIAddressReserveNextFid(zpciIds->fids, addr)) {
> +        virDomainZPCIAddressReleaseUid(zpciIds->uids, addr);
> +        return -1;
> +    }

Not sure I get the logic here... ReserveNextAddress() is supposed
to pick the next available address and reserve it, but IIUC this
will skip picking either id based on whether they were assigned.
I don't think that's what we want.

Also all functions that return an int should be called like

  if (virDomainZPCIAddressReserveNextUid() < 0) {
      ...
  }

[...]
> +static int
> +virDomainPCIAddressExtensionEnsureAddr(virDomainPCIAddressSetPtr addrs,
> +                                       virDomainDeviceInfoPtr dev)
> +{

It's weird that this function doesn't get extFlags as an argument,
unlike the other ones you've introduced. Better make it consistent.

> +    virZPCIDeviceAddressPtr zpci = dev->addr.pci.zpci;
> +
> +    if (zpci && !dev->pciAddressExtFlags) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("zPCI is not supported."));
> +        return -1;
> +    }

The error message is very generic here, it should at the very least
make it clear that zPCI is not supported *for the specific device*.

I'm not sure this is the best place to perform that kind of check,
either.

-- 
Andrea Bolognani / Red Hat / Virtualization




More information about the libvir-list mailing list