mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 21:55:25 +00:00
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:
parent
6b5c6314b2
commit
2020e2c6f2
@ -7396,7 +7396,9 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
<pre>
|
||||
...
|
||||
<devices>
|
||||
<iommu model='intel'/>
|
||||
<iommu model='intel'>
|
||||
<driver intremap='on'/>
|
||||
</iommu>
|
||||
</devices>
|
||||
...
|
||||
</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><ioapic driver='qemu'/></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>
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -2209,6 +2209,7 @@ typedef enum {
|
||||
|
||||
struct _virDomainIOMMUDef {
|
||||
virDomainIOMMUModel model;
|
||||
virTristateSwitch intremap;
|
||||
};
|
||||
/*
|
||||
* Guest VM main configuration
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user