On 05/03/2017 10:05 AM, Ján Tomko wrote:
Add a new attribute to control the caching mode.
https://bugzilla.redhat.com/show_bug.cgi?id=1427005
---
docs/formatdomain.html.in | 9 ++++
docs/schemas/domaincommon.rng | 5 +++
src/conf/domain_conf.c | 24 +++++++++--
src/conf/domain_conf.h | 1 +
.../qemuxml2argv-intel-iommu-caching-mode.xml | 50 ++++++++++++++++++++++
.../qemuxml2xmlout-intel-iommu-caching-mode.xml | 1 +
tests/qemuxml2xmltest.c | 1 +
7 files changed, 88 insertions(+), 3 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-caching-mode.xml
create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-caching-mode.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index ca98f0e..4552037 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -7426,6 +7426,15 @@ qemu-kvm -net nic,model=? /dev/null
<span class="since">Since 3.4.0</span> (QEMU/KVM
only)
</p>
</dd>
+ <dt><code>caching_mode</code></dt>
+ <dd>
+ <p>
+ The <code>caching_mode</code> attribute with possible values
+ <code>on</code> and <code>off</code> can be used
to
+ turn on the VT-d caching mode (useful for assigned devices)
s/)/).
<pesky period>
+ <span class="since">Since
3.4.0</span> (QEMU/KVM only)
+ </p>
+ </dd>
</dl>
</dd>
</dl>
[...]
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 4eefd92..ef31f4a 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -14176,6 +14176,15 @@ virDomainIOMMUDefParseXML(xmlNodePtr node,
iommu->intremap = val;
}
+ VIR_FREE(tmp);
+ if ((tmp = virXPathString("string(./driver/@caching_mode)", ctxt))) {
+ if ((val = virTristateSwitchTypeFromString(tmp)) < 0) {
+ virReportError(VIR_ERR_XML_ERROR, _("unknown caching_mode value:
%s"), tmp);
+ goto cleanup;
+ }
+ iommu->caching_mode = val;
+ }
+
ret = iommu;
iommu = NULL;
@@ -24143,9 +24152,18 @@ virDomainIOMMUDefFormat(virBufferPtr buf,
virBufferAdjustIndent(&childBuf, virBufferGetIndent(buf, false) + 2);
- if (iommu->intremap != VIR_TRISTATE_SWITCH_ABSENT) {
- virBufferAsprintf(&childBuf, "<driver
intremap='%s'/>\n",
- virTristateSwitchTypeToString(iommu->intremap));
+ if (iommu->intremap != VIR_TRISTATE_SWITCH_ABSENT ||
+ iommu->caching_mode != VIR_TRISTATE_SWITCH_ABSENT) {
+ virBufferAddLit(&childBuf, "<driver");
+ if (iommu->intremap) {
Of course this only prints/works correctly because SWITCH_ABSENT = 0
Since you check below you should check here...
ACK w/ adjustments.
John
+ virBufferAsprintf(&childBuf, "
intremap='%s'",
+ virTristateSwitchTypeToString(iommu->intremap));
+ }
+ if (iommu->caching_mode != VIR_TRISTATE_SWITCH_ABSENT) {
+ virBufferAsprintf(&childBuf, " caching_mode='%s'",
+ virTristateSwitchTypeToString(iommu->caching_mode));
+ }
+ virBufferAddLit(&childBuf, "/>\n");
}
virBufferAsprintf(buf, "<iommu model='%s'",
[...]