[libvirt] [PATCH v3 15/26] qemu: Automatically pick target index and model for pci-root controllers

Laine Stump laine at laine.org
Sun Jun 25 20:00:23 UTC 2017


On 06/23/2017 11:03 AM, Andrea Bolognani wrote:
> pSeries guests will soon need the new information; luckily,
> we can figure it out automatically most of the time, so
> users won't have to worry about it.
> 
> Signed-off-by: Andrea Bolognani <abologna at redhat.com>

Reviewed-by: Laine Stump <laine at laine.org>

(assuming name change from idx to targetIdx in all appropriate places)

> ---
>  src/qemu/qemu_domain_address.c                     | 88 +++++++++++++++++++++-
>  .../qemuargv2xmldata/qemuargv2xml-pseries-disk.xml |  5 +-
>  .../qemuargv2xml-pseries-nvram.xml                 |  5 +-
>  .../qemuxml2xmlout-panic-pseries.xml               |  5 +-
>  .../qemuxml2xmlout-ppc64-usb-controller-legacy.xml |  5 +-
>  .../qemuxml2xmlout-ppc64-usb-controller.xml        |  5 +-
>  .../qemuxml2xmlout-pseries-nvram.xml               |  5 +-
>  .../qemuxml2xmlout-pseries-panic-missing.xml       |  5 +-
>  .../qemuxml2xmlout-pseries-panic-no-address.xml    |  5 +-
>  9 files changed, 118 insertions(+), 10 deletions(-)
> 
> diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
> index b5b863f..960ea04 100644
> --- a/src/qemu/qemu_domain_address.c
> +++ b/src/qemu/qemu_domain_address.c
> @@ -1861,6 +1861,7 @@ qemuDomainSupportsPCI(virDomainDefPtr def,
>  
>  static void
>  qemuDomainPCIControllerSetDefaultModelName(virDomainControllerDefPtr cont,
> +                                           virDomainDefPtr def,
>                                             virQEMUCapsPtr qemuCaps)
>  {
>      int *modelName = &cont->opts.pciopts.modelName;
> @@ -1897,6 +1898,9 @@ qemuDomainPCIControllerSetDefaultModelName(virDomainControllerDefPtr cont,
>          *modelName = VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PXB_PCIE;
>          break;
>      case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT:
> +        if (qemuDomainIsPSeries(def))
> +            *modelName = VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_SPAPR_PCI_HOST_BRIDGE;
> +        break;
>      case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT:
>      case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST:
>          break;
> @@ -1904,6 +1908,63 @@ qemuDomainPCIControllerSetDefaultModelName(virDomainControllerDefPtr cont,
>  }
>  
>  
> +/**
> + * qemuDomainAddressFindNewTargetIndex:
> + * @def: domain definition
> + *
> + * Find a target index that can be used for a PCI controller.
> + *
> + * Returns: an unused target index, or -1 if all available target
> + *          indexes are already taken.
> + */
> +static int
> +qemuDomainAddressFindNewTargetIndex(virDomainDefPtr def)
> +{
> +    int idx;
> +    int ret = -1;
> +
> +    /* Try all indexes between 1 and 31 - QEMU only supports 32
> +     * PHBs, and 0 is reserved for the default, implicit one */
> +    for (idx = 1; idx <= 31; idx++) {
> +        bool found = false;
> +        size_t i;
> +
> +        for (i = 0; i < def->ncontrollers; i++) {
> +            virDomainControllerDefPtr cont = def->controllers[i];
> +            virDomainPCIControllerOptsPtr opts;
> +
> +            /* We only care about pci-root controllers */
> +            if (cont->type != VIR_DOMAIN_CONTROLLER_TYPE_PCI ||
> +                cont->model != VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) {
> +                continue;
> +            }
> +
> +            opts = &cont->opts.pciopts;
> +
> +            /* More specifically, we only care about PHBs */
> +            if (opts->modelName != VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_SPAPR_PCI_HOST_BRIDGE)
> +                continue;
> +
> +            /* Stop looking as soon as we find a PHB that's
> +             * already using this specific target index */
> +            if (opts->idx == idx) {
> +                found = true;
> +                break;
> +            }
> +        }
> +
> +        /* If no existing PCI controller uses this index, great,
> +         * it means it's free and we can return it to the caller */
> +        if (!found) {
> +            ret = idx;
> +            break;
> +        }
> +    }
> +
> +    return ret;
> +}
> +
> +
>  static int
>  qemuDomainAddressFindNewBusNr(virDomainDefPtr def)
>  {
> @@ -2164,7 +2225,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
>               * device in qemu) for any controller that doesn't yet
>               * have it set.
>               */
> -            qemuDomainPCIControllerSetDefaultModelName(cont, qemuCaps);
> +            qemuDomainPCIControllerSetDefaultModelName(cont, def, qemuCaps);
>  
>              /* set defaults for any other auto-generated config
>               * options for this controller that haven't been
> @@ -2201,9 +2262,32 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
>                      goto cleanup;
>                  }
>                  break;
> +            case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT:
> +                if (!qemuDomainIsPSeries(def))
> +                    break;
> +                if (options->idx == -1) {
> +                    if (cont->idx == 0) {
> +                        /* The pci-root controller with controller index 0
> +                         * must always be assigned target index 0, because
> +                         * it represents the implicit PHB which is treated
> +                         * differently than all other PHBs */
> +                        options->idx = 0;
> +                    } else {
> +                        /* For all other PHBs the target index doesn't need
> +                         * to match the controller index or have any
> +                         * particular value, really */
> +                        options->idx = qemuDomainAddressFindNewTargetIndex(def);
> +                    }
> +                }
> +                if (options->idx == -1) {
> +                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                                   _("No usable target index found for %d"),
> +                                   addr->bus);
> +                    goto cleanup;
> +                }
> +                break;
>              case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE:
>              case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT:
> -            case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT:
>              case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT:
>              case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST:
>                  break;
> diff --git a/tests/qemuargv2xmldata/qemuargv2xml-pseries-disk.xml b/tests/qemuargv2xmldata/qemuargv2xml-pseries-disk.xml
> index 1bad8ee..601d0f7 100644
> --- a/tests/qemuargv2xmldata/qemuargv2xml-pseries-disk.xml
> +++ b/tests/qemuargv2xmldata/qemuargv2xml-pseries-disk.xml
> @@ -30,7 +30,10 @@
>      <controller type='usb' index='0'>
>        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
>      </controller>
> -    <controller type='pci' index='0' model='pci-root'/>
> +    <controller type='pci' index='0' model='pci-root'>
> +      <model name='spapr-pci-host-bridge'/>
> +      <target index='0'/>
> +    </controller>
>      <controller type='scsi' index='0'>
>        <address type='spapr-vio' reg='0x2000'/>
>      </controller>
> diff --git a/tests/qemuargv2xmldata/qemuargv2xml-pseries-nvram.xml b/tests/qemuargv2xmldata/qemuargv2xml-pseries-nvram.xml
> index 7e9f864..7787847 100644
> --- a/tests/qemuargv2xmldata/qemuargv2xml-pseries-nvram.xml
> +++ b/tests/qemuargv2xmldata/qemuargv2xml-pseries-nvram.xml
> @@ -17,7 +17,10 @@
>      <controller type='usb' index='0'>
>        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
>      </controller>
> -    <controller type='pci' index='0' model='pci-root'/>
> +    <controller type='pci' index='0' model='pci-root'>
> +      <model name='spapr-pci-host-bridge'/>
> +      <target index='0'/>
> +    </controller>
>      <memballoon model='none'/>
>      <nvram>
>        <address type='spapr-vio' reg='0x4000'/>
> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml
> index 1ed11ce..7fb49fe 100644
> --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml
> +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml
> @@ -17,7 +17,10 @@
>      <controller type='usb' index='0'>
>        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
>      </controller>
> -    <controller type='pci' index='0' model='pci-root'/>
> +    <controller type='pci' index='0' model='pci-root'>
> +      <model name='spapr-pci-host-bridge'/>
> +      <target index='0'/>
> +    </controller>
>      <serial type='pty'>
>        <target port='0'/>
>        <address type='spapr-vio' reg='0x30000000'/>
> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller-legacy.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller-legacy.xml
> index b7bde24..673b81d 100644
> --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller-legacy.xml
> +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller-legacy.xml
> @@ -22,7 +22,10 @@
>      <controller type='usb' index='0'>
>        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
>      </controller>
> -    <controller type='pci' index='0' model='pci-root'/>
> +    <controller type='pci' index='0' model='pci-root'>
> +      <model name='spapr-pci-host-bridge'/>
> +      <target index='0'/>
> +    </controller>
>      <memballoon model='virtio'>
>        <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
>      </memballoon>
> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller.xml
> index 82aaaca..68995a9 100644
> --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller.xml
> +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller.xml
> @@ -22,7 +22,10 @@
>      <controller type='usb' index='0' model='pci-ohci'>
>        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
>      </controller>
> -    <controller type='pci' index='0' model='pci-root'/>
> +    <controller type='pci' index='0' model='pci-root'>
> +      <model name='spapr-pci-host-bridge'/>
> +      <target index='0'/>
> +    </controller>
>      <memballoon model='virtio'>
>        <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
>      </memballoon>
> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-nvram.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-nvram.xml
> index 713f31c..f89b23b 100644
> --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-nvram.xml
> +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-nvram.xml
> @@ -17,7 +17,10 @@
>      <controller type='usb' index='0'>
>        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
>      </controller>
> -    <controller type='pci' index='0' model='pci-root'/>
> +    <controller type='pci' index='0' model='pci-root'>
> +      <model name='spapr-pci-host-bridge'/>
> +      <target index='0'/>
> +    </controller>
>      <memballoon model='none'/>
>      <nvram>
>        <address type='spapr-vio' reg='0x4000'/>
> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
> index 1ed11ce..7fb49fe 100644
> --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
> +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
> @@ -17,7 +17,10 @@
>      <controller type='usb' index='0'>
>        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
>      </controller>
> -    <controller type='pci' index='0' model='pci-root'/>
> +    <controller type='pci' index='0' model='pci-root'>
> +      <model name='spapr-pci-host-bridge'/>
> +      <target index='0'/>
> +    </controller>
>      <serial type='pty'>
>        <target port='0'/>
>        <address type='spapr-vio' reg='0x30000000'/>
> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml
> index 1ed11ce..7fb49fe 100644
> --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml
> +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml
> @@ -17,7 +17,10 @@
>      <controller type='usb' index='0'>
>        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
>      </controller>
> -    <controller type='pci' index='0' model='pci-root'/>
> +    <controller type='pci' index='0' model='pci-root'>
> +      <model name='spapr-pci-host-bridge'/>
> +      <target index='0'/>
> +    </controller>
>      <serial type='pty'>
>        <target port='0'/>
>        <address type='spapr-vio' reg='0x30000000'/>
> 




More information about the libvir-list mailing list