From 4c2b1b9cf0bcd8af7a7d011cd758bb6f11e5477b Mon Sep 17 00:00:00 2001 Message-Id: <4c2b1b9cf0bcd8af7a7d011cd758bb6f11e5477b@dist-git> From: Andrea Bolognani Date: Mon, 17 Jul 2017 12:09:09 +0200 Subject: [PATCH] conf: Parse and format Signed-off-by: Andrea Bolognani Reviewed-by: Laine Stump (cherry picked from commit 47dd6e282ab8b0db662092cf0cc53163d805ac4d) Conflicts: * src/conf/domain_conf.c: caused by e146264aaadf5aecf727d8c7b3d85683b55b6c48, which significantly refactored virDomainControllerDefFormat(), not being in the tree. Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1431193 Signed-off-by: Andrea Bolognani Signed-off-by: Jiri Denemark --- docs/formatdomain.html.in | 6 ++++++ docs/schemas/domaincommon.rng | 5 +++++ src/conf/domain_conf.c | 32 ++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 1 + 4 files changed, 44 insertions(+) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index dc8e7d2dc7..bc67a53408 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -3760,6 +3760,12 @@ libvirt API to attach host devices to the correct pci-expander-bus when assigning them to the domain). +
index
+
+ pci-root controllers for pSeries guests use this attribute to + record the order they will show up in the guest. + Since 3.6.0 +

For machine types which provide an implicit PCI bus, the pci-root diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 964e5c5bd5..b1461d4c61 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1945,6 +1945,11 @@ + + + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 8a030c9b68..599db5cafe 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1854,6 +1854,7 @@ virDomainControllerDefNew(virDomainControllerType type) def->opts.pciopts.chassis = -1; def->opts.pciopts.port = -1; def->opts.pciopts.busNr = -1; + def->opts.pciopts.targetIndex = -1; def->opts.pciopts.numaNode = -1; break; case VIR_DOMAIN_CONTROLLER_TYPE_IDE: @@ -8964,6 +8965,7 @@ virDomainControllerDefParseXML(xmlNodePtr node, char *chassis = NULL; char *port = NULL; char *busNr = NULL; + char *targetIndex = NULL; int numaNode = -1; char *ioeventfd = NULL; char *portsStr = NULL; @@ -9036,6 +9038,7 @@ virDomainControllerDefParseXML(xmlNodePtr node, chassis = virXMLPropString(cur, "chassis"); port = virXMLPropString(cur, "port"); busNr = virXMLPropString(cur, "busNr"); + targetIndex = virXMLPropString(cur, "index"); processedTarget = true; } } @@ -9254,6 +9257,30 @@ virDomainControllerDefParseXML(xmlNodePtr node, goto error; } } + if (targetIndex) { + if (virStrToLong_i(targetIndex, NULL, 0, + &def->opts.pciopts.targetIndex) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid target index '%s' in PCI controller"), + targetIndex); + goto error; + } + if (def->opts.pciopts.targetIndex < 0 || + def->opts.pciopts.targetIndex > 31) { + virReportError(VIR_ERR_XML_ERROR, + _("PCI controller target index '%s' out of " + "range - must be 0-31"), + targetIndex); + goto error; + } + if ((def->idx == 0 && def->opts.pciopts.targetIndex != 0) || + (def->idx != 0 && def->opts.pciopts.targetIndex == 0)) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Only the PCI controller with index 0 can " + "have target index 0, and vice versa")); + goto error; + } + } if (numaNode >= 0) def->opts.pciopts.numaNode = numaNode; break; @@ -9275,6 +9302,7 @@ virDomainControllerDefParseXML(xmlNodePtr node, VIR_FREE(chassis); VIR_FREE(port); VIR_FREE(busNr); + VIR_FREE(targetIndex); VIR_FREE(ioeventfd); VIR_FREE(portsStr); VIR_FREE(iothread); @@ -21615,6 +21643,7 @@ virDomainControllerDefFormat(virBufferPtr buf, def->opts.pciopts.chassis != -1 || def->opts.pciopts.port != -1 || def->opts.pciopts.busNr != -1 || + def->opts.pciopts.targetIndex != -1 || def->opts.pciopts.numaNode != -1) pciTarget = true; break; @@ -21655,6 +21684,9 @@ virDomainControllerDefFormat(virBufferPtr buf, if (def->opts.pciopts.busNr != -1) virBufferAsprintf(buf, " busNr='%d'", def->opts.pciopts.busNr); + if (def->opts.pciopts.targetIndex != -1) + virBufferAsprintf(buf, " index='%d'", + def->opts.pciopts.targetIndex); if (def->opts.pciopts.numaNode == -1) { virBufferAddLit(buf, "/>\n"); } else { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index e287e6d7f3..50fdc6e2a6 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -786,6 +786,7 @@ struct _virDomainPCIControllerOpts { int chassis; int port; int busNr; /* used by pci-expander-bus, -1 == unspecified */ + int targetIndex; /* used by spapr-pci-host-bridge, -1 == unspecified */ /* numaNode is a *subelement* of target (to match existing * item in memory target config) -1 == unspecified */ -- 2.13.3