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

Andrea Bolognani posted 26 patches 8 years, 7 months ago
[libvirt] [PATCH v3 17/26] qemu: Deal with PHB naming conventions
Posted by Andrea Bolognani 8 years, 7 months ago
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@redhat.com>
---
 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");
-- 
2.7.5

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v3 17/26] qemu: Deal with PHB naming conventions
Posted by Laine Stump 8 years, 7 months ago
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@redhat.com>

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

Reviewed-by: Laine Stump <laine@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");
> 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list