The subject line implies (to me) that this patch somehow automagically
creates multiple PHBs for the domain. It looks like what it does is to
add the proper commandline args to the qemu command when multiple PHBs
have already been added to the config.
As for the functionality:
Reviewed-by: Laine Stump <laine(a)laine.org>
On 06/23/2017 11:03 AM, Andrea Bolognani wrote:
Additional PHBs (pci-root controllers) will be created for
the guest using the spapr-pci-host-bridge QEMU device, if
available; the implicit default PHB, while present in the
guest configuration, will be skipped.
Resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=1431193
Signed-off-by: Andrea Bolognani <abologna(a)redhat.com>
---
src/qemu/qemu_command.c | 47 ++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 44 insertions(+), 3 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index dba2519..fb0beed 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -3164,6 +3164,40 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef,
def->opts.pciopts.numaNode);
break;
case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT:
+ if (def->opts.pciopts.modelName ==
VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_NONE ||
+ def->opts.pciopts.idx == -1) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("autogenerated pci-root options not set"));
+ goto error;
+ }
+
+ /* Skip the implicit one */
+ if (def->opts.pciopts.idx == 0)
+ goto done;
+
+ modelName =
virDomainControllerPCIModelNameTypeToString(def->opts.pciopts.modelName);
+ if (!modelName) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unknown pci-root model name value %d"),
+ def->opts.pciopts.modelName);
+ goto error;
+ }
+ if (def->opts.pciopts.modelName !=
VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_SPAPR_PCI_HOST_BRIDGE) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("PCI controller model name '%s' is not
valid for a pci-root"),
+ modelName);
+ goto error;
+ }
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("the spapr-pci-host-bridge controller "
+ "is not supported in this QEMU binary"));
+ goto error;
+ }
+ virBufferAsprintf(&buf, "%s,index=%d,id=%s",
+ modelName, def->opts.pciopts.idx,
+ def->info.alias);
+ break;
case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT:
case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST:
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -3213,6 +3247,7 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef,
if (virBufferCheckError(&buf) < 0)
goto error;
+ done:
*devstr = virBufferContentAndReset(&buf);
return 0;
@@ -3270,10 +3305,16 @@ qemuBuildControllerDevCommandLine(virCommandPtr cmd,
continue;
}
- /* skip pci-root/pcie-root */
+ /* skip pcie-root */
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
- (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT ||
- cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT))
+ cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT)
+ continue;
+
+ /* Skip pci-root, except for pSeries guests (which actually
+ * support more than one PCI Host Bridge per guest) */
+ if (!qemuDomainIsPSeries(def) &&
+ cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
+ cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT)
continue;
/* first SATA controller on Q35 machines is implicit */