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@xxxxxxxxxx> Sigh. Words can't even describe my feelings. Nothing else you can do about it though. Reviewed-by: Laine Stump <laine@xxxxxxxxx> > --- > 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@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list