[libvirt] [PATCH v3 17/26] qemu: Deal with PHB naming conventions

Laine Stump laine at laine.org
Tue Jun 27 01:20:06 UTC 2017


On 06/23/2017 11:03 AM, Andrea Bolognani wrote:
> Usually, a controller with alias 'x' will create a bus with the
> same name; however, the bus created by a PHBs with alias 'x' will
> be named 'x.0' instead, so we need to account for that.
> 
> As an exception to the exception, the implicit PHB that's added
> automatically to every pSeries guest creates the 'pci.0' bus.
> 
> Signed-off-by: Andrea Bolognani <abologna at redhat.com>

Sigh. Words can't even describe my feelings. Nothing else you can do
about it though.

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

> ---
>  src/qemu/qemu_command.c | 20 +++++++++++++++++++-
>  1 file changed, 19 insertions(+), 1 deletion(-)
> 
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index f79fbfc..dba2519 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -302,6 +302,9 @@ qemuBuildDeviceAddressStr(virBufferPtr buf,
>      int ret = -1;
>      char *devStr = NULL;
>      const char *contAlias = NULL;
> +    virDomainControllerModelPCI contModel;
> +    virDomainControllerPCIModelName contModelName;
> +    int contIndex;
>  
>      if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
>          size_t i;
> @@ -314,6 +317,9 @@ qemuBuildDeviceAddressStr(virBufferPtr buf,
>              if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
>                  cont->idx == info->addr.pci.bus) {
>                  contAlias = cont->info.alias;
> +                contModel = cont->model;
> +                contModelName = cont->opts.pciopts.modelName;
> +                contIndex = cont->opts.pciopts.idx;
>                  if (!contAlias) {
>                      virReportError(VIR_ERR_INTERNAL_ERROR,
>                                     _("Device alias was not set for PCI "
> @@ -349,7 +355,19 @@ qemuBuildDeviceAddressStr(virBufferPtr buf,
>              }
>          }
>  
> -        virBufferAsprintf(buf, ",bus=%s", contAlias);
> +        if (contModel == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT &&
> +            contModelName == VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_SPAPR_PCI_HOST_BRIDGE &&
> +            contIndex > 0) {
> +            /* The PCI bus created by a spapr-pci-host-bridge device with
> +             * alias 'x' will be called 'x.0' rather than 'x'; however,
> +             * this does not apply to the implicit PHB in a pSeries guest,
> +             * which always has the hardcoded name 'pci.0' */
> +            virBufferAsprintf(buf, ",bus=%s.0", contAlias);
> +        } else {
> +            /* For all other controllers, the bus name matches the alias
> +             * of the corresponding controller */
> +            virBufferAsprintf(buf, ",bus=%s", contAlias);
> +        }
>  
>          if (info->addr.pci.multi == VIR_TRISTATE_SWITCH_ON)
>              virBufferAddLit(buf, ",multifunction=on");
> 




More information about the libvir-list mailing list