From: Bjoern Walk Date: Mon, 6 Apr 2020 13:13:25 +0000 (+0200) Subject: conf: domain: support for virtio packed option X-Git-Tag: v6.3.0-rc1~210 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0e3b30944db509ce2674d0eebf2894c510249081;p=thirdparty%2Flibvirt.git conf: domain: support for virtio packed option 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 --- 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; }; /*