[libvirt] [PATCHv4 5/5] qemu: auto-add bridges and allow using them

Eric Blake eblake at redhat.com
Thu Apr 25 00:39:05 UTC 2013


On 04/23/2013 06:47 AM, Ján Tomko wrote:
> Add a "dry run" address allocation to figure out how many bridges
> will be needed for all the devices without explicit addresses.
> 
> Auto-add just enough bridges to put all the devices on, or up to the
> bridge with the largest specified index.
> ---
> 
> v4:
> Moved the check for duplicate controller indexes to a separate patch
> Simplified nbuses and max_idx computation
> Only does two-pass allocation of PCI addresses if the machine has a PCI bus
> Does not contain traces of rebasing or spurious whitespace changes
> Tests auto-adding PCI bridges in xml->argv and xml->xml tests.
> 
> @@ -1233,9 +1236,45 @@ static bool qemuPCIAddressValidate(qemuDomainPCIAddressSetPtr addrs ATTRIBUTE_UN
>                         QEMU_PCI_ADDRESS_SLOT_LAST);
>          return false;
>      }
> +    if (addr->slot == 0) {
> +        if (addr->bus) {
> +            virReportError(VIR_ERR_XML_ERROR, "%s",
> +                           _("Slot 0 is unusable on PCI bridges"));
> +        } else {
> +            virReportError(VIR_ERR_XML_ERROR, "%s",
> +                          _("Slot 0 on bus 0 is reserved for the host bridge"));

Indentation is off.

> @@ -1326,15 +1368,53 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
>      qemuDomainObjPrivatePtr priv = NULL;
>  
>      if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
> +        int max_idx = -1;

So let's trace what happens if I have XML with no <controller> but I do
use 33 PCI devices and have a capable qemu:

max_idx starts at -1,

>          int nbuses = 0;
>          int i;
> +        int rv;
>  
>          for (i = 0; i < def->ncontrollers; i++) {
> -            if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI)
> -                nbuses++;
> +            if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) {
> +                if (def->controllers[i]->idx > max_idx)
> +                    max_idx = def->controllers[i]->idx;
> +            }
> +        }

If no controllers were specified, it is still at -1,

> +
> +        nbuses = max_idx + 1;

so nbuses is now 0,

> +
> +        if (nbuses > 0 &&
> +            virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE)) {

therefore we skip this if,

> +            virDomainDeviceInfo info;
> +            /* 1st pass to figure out how many PCI bridges we need */
> +            if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, true)))
> +                goto cleanup;
> +            if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0)
> +                goto cleanup;
> +            /* Reserve 1 extra slot for a (potential) bridge */
> +            if (qemuDomainPCIAddressSetNextAddr(addrs, &info) < 0)
> +                goto cleanup;
> +
> +            for (i = 1; i < addrs->nbuses; i++) {
> +                if ((rv = virDomainDefMaybeAddController(
> +                        def, VIR_DOMAIN_CONTROLLER_TYPE_PCI,
> +                        i, VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE)) < 0)
> +                    goto cleanup;
> +                /* If we added a new bridge, we will need one more address */
> +                if (rv > 0 && qemuDomainPCIAddressSetNextAddr(addrs, &info) < 0)
> +                        goto cleanup;
> +            }
> +            nbuses = addrs->nbuses;
> +            qemuDomainPCIAddressSetFree(addrs);
> +            addrs = NULL;
> +
> +        } else if (max_idx > 0) {

we don't error out,

> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                           _("PCI bridges are not supported "
> +                             "by this QEMU binary"));
> +            goto cleanup;
>          }

but we also didn't auto-instantiate any bridges, even if the capability
is supported.  Is that a problem?

ACK if you can answer my question and fix the minor issues.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 621 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20130424/5d6d6797/attachment-0001.sig>


More information about the libvir-list mailing list