From 0e3b30944db509ce2674d0eebf2894c510249081 Mon Sep 17 00:00:00 2001 From: Bjoern Walk Date: Mon, 6 Apr 2020 15:13:25 +0200 Subject: [PATCH] conf: domain: support for virtio packed option MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Expose the virtio parameter for packed virtqueues as an optional libvirt XML attribute to virtio-backed devices, e.g.: If the attribute is omitted, the default value for this attribute is 'off' and regular split virtqueues are used. Reviewed-by: Ján Tomko Reviewed-by: Boris Fiuczynski Signed-off-by: Bjoern Walk Signed-off-by: Ján Tomko --- docs/schemas/domaincommon.rng | 5 +++++ src/conf/domain_conf.c | 28 ++++++++++++++++++++++++++++ src/conf/domain_conf.h | 1 + 3 files changed, 34 insertions(+) diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index dcf2e09db8..12e842cec5 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -5961,6 +5961,11 @@ + + + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 6ad7552bde..c478d79554 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1512,6 +1512,16 @@ virDomainVirtioOptionsParseXML(xmlNodePtr driver, } res->ats = val; } + VIR_FREE(str); + + if ((str = virXMLPropString(driver, "packed"))) { + if ((val = virTristateSwitchTypeFromString(str)) <= 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("invalid packed value")); + return -1; + } + res->packed = val; + } return 0; } @@ -5091,6 +5101,12 @@ virDomainCheckVirtioOptions(virDomainVirtioOptionsPtr virtio) "for virtio devices")); return -1; } + if (virtio->packed != VIR_TRISTATE_SWITCH_ABSENT) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("packed driver option is only supported " + "for virtio devices")); + return -1; + } return 0; } @@ -7377,6 +7393,10 @@ virDomainVirtioOptionsFormat(virBufferPtr buf, virBufferAsprintf(buf, " ats='%s'", virTristateSwitchTypeToString(virtio->ats)); } + if (virtio->packed != VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(buf, " packed='%s'", + virTristateSwitchTypeToString(virtio->packed)); + } } @@ -22415,6 +22435,14 @@ virDomainVirtioOptionsCheckABIStability(virDomainVirtioOptionsPtr src, virTristateSwitchTypeToString(src->ats)); return false; } + if (src->packed != dst->packed) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target device packed option '%s' does not " + "match source '%s'"), + virTristateSwitchTypeToString(dst->packed), + virTristateSwitchTypeToString(src->packed)); + return false; + } return true; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 024f692053..33e1e2235c 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2417,6 +2417,7 @@ struct _virDomainVsockDef { struct _virDomainVirtioOptions { virTristateSwitch iommu; virTristateSwitch ats; + virTristateSwitch packed; }; /* -- 2.47.2