conf: add <driver intremap> to <iommu>

Add a new attribute to control interrupt remapping.

https://bugzilla.redhat.com/show_bug.cgi?id=1427005
This commit is contained in:
Ján Tomko 2017-03-17 08:35:22 +01:00
parent 6b5c6314b2
commit 2020e2c6f2
5 changed files with 70 additions and 6 deletions

View File

@ -7396,7 +7396,9 @@ qemu-kvm -net nic,model=? /dev/null
<pre>
...
&lt;devices&gt;
&lt;iommu model='intel'/&gt;
&lt;iommu model='intel'&gt;
&lt;driver intremap='on'/&gt;
&lt;/iommu&gt;
&lt;/devices&gt;
...
</pre>
@ -7407,6 +7409,26 @@ qemu-kvm -net nic,model=? /dev/null
Currently only the <code>intel</code> model is supported.
</p>
</dd>
<dt><code>driver</code></dt>
<dd>
<p>
The <code>driver</code> subelement can be used to configure
additional options:
</p>
<dl>
<dt><code>intremap</code></dt>
<dd>
<p>
The <code>intremap</code> attribute with possible values
<code>on</code> and <code>off</code> can be used to
turn on interrupt remapping, a part of the VT-d functionality.
Currently this requires split I/O APIC
(<code>&lt;ioapic driver='qemu'/&gt;</code>).
<span class="since">Since 3.4.0</span> (QEMU/KVM only)
</p>
</dd>
</dl>
</dd>
</dl>
<h3><a name="seclabel">Security label</a></h3>

View File

@ -3947,6 +3947,15 @@
<attribute name="model">
<value>intel</value>
</attribute>
<optional>
<element name="driver">
<optional>
<attribute name="intremap">
<ref name="virOnOff"/>
</attribute>
</optional>
</element>
</optional>
</element>
</define>

View File

@ -14141,12 +14141,16 @@ virDomainMemoryDefParseXML(xmlNodePtr memdevNode,
static virDomainIOMMUDefPtr
virDomainIOMMUDefParseXML(xmlNodePtr node)
virDomainIOMMUDefParseXML(xmlNodePtr node,
xmlXPathContextPtr ctxt)
{
virDomainIOMMUDefPtr iommu = NULL, ret = NULL;
xmlNodePtr save = ctxt->node;
char *tmp = NULL;
int val;
ctxt->node = node;
if (VIR_ALLOC(iommu) < 0)
goto cleanup;
@ -14163,10 +14167,20 @@ virDomainIOMMUDefParseXML(xmlNodePtr node)
iommu->model = val;
VIR_FREE(tmp);
if ((tmp = virXPathString("string(./driver/@intremap)", ctxt))) {
if ((val = virTristateSwitchTypeFromString(tmp)) < 0) {
virReportError(VIR_ERR_XML_ERROR, _("unknown intremap value: %s"), tmp);
goto cleanup;
}
iommu->intremap = val;
}
ret = iommu;
iommu = NULL;
cleanup:
ctxt->node = save;
VIR_FREE(iommu);
VIR_FREE(tmp);
return ret;
@ -14319,7 +14333,7 @@ virDomainDeviceDefParse(const char *xmlStr,
goto error;
break;
case VIR_DOMAIN_DEVICE_IOMMU:
if (!(dev->data.iommu = virDomainIOMMUDefParseXML(node)))
if (!(dev->data.iommu = virDomainIOMMUDefParseXML(node, ctxt)))
goto error;
break;
case VIR_DOMAIN_DEVICE_NONE:
@ -18449,7 +18463,7 @@ virDomainDefParseXML(xmlDocPtr xml,
}
if (n > 0) {
if (!(def->iommu = virDomainIOMMUDefParseXML(nodes[0])))
if (!(def->iommu = virDomainIOMMUDefParseXML(nodes[0], ctxt)))
goto error;
}
VIR_FREE(nodes);
@ -24125,8 +24139,24 @@ static void
virDomainIOMMUDefFormat(virBufferPtr buf,
const virDomainIOMMUDef *iommu)
{
virBufferAsprintf(buf, "<iommu model='%s'/>\n",
virBuffer childBuf = VIR_BUFFER_INITIALIZER;
virBufferAdjustIndent(&childBuf, virBufferGetIndent(buf, false) + 2);
if (iommu->intremap != VIR_TRISTATE_SWITCH_ABSENT) {
virBufferAsprintf(&childBuf, "<driver intremap='%s'/>\n",
virTristateSwitchTypeToString(iommu->intremap));
}
virBufferAsprintf(buf, "<iommu model='%s'",
virDomainIOMMUModelTypeToString(iommu->model));
if (virBufferUse(&childBuf)) {
virBufferAddLit(buf, ">\n");
virBufferAddBuffer(buf, &childBuf);
virBufferAddLit(buf, "</iommu>\n");
} else {
virBufferAddLit(buf, "/>\n");
}
}

View File

@ -2209,6 +2209,7 @@ typedef enum {
struct _virDomainIOMMUDef {
virDomainIOMMUModel model;
virTristateSwitch intremap;
};
/*
* Guest VM main configuration

View File

@ -24,6 +24,8 @@
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<memballoon model='none'/>
<iommu model='intel'/>
<iommu model='intel'>
<driver intremap='on'/>
</iommu>
</devices>
</domain>