conf: add eim attribute to <iommu><driver>

Add an attribute to control extended interrupt mode.

https://bugzilla.redhat.com/show_bug.cgi?id=1451282

Reviewed-by: Andrea Bolognani <abologna@redhat.com>
This commit is contained in:
Ján Tomko 2017-05-17 17:22:30 +02:00
parent 2453501fc8
commit dc61d92758
7 changed files with 73 additions and 0 deletions

View File

@ -7436,6 +7436,19 @@ qemu-kvm -net nic,model=? /dev/null
<span class="since">Since 3.4.0</span> (QEMU/KVM only)
</p>
</dd>
<dt><code>eim</code></dt>
<dd>
<p>
The <code>eim</code> attribute (with possible values
<code>on</code> and <code>off</code>) can be used to
configure Extended Interrupt Mode. A q35 domain with
split I/O APIC (as described in
<a href="#elementsFeatures">hypervisor features</a>),
and both interrupt remapping and EIM turned on for
the IOMMU, will be able to use more than 255 vCPUs.
<span class="since">Since 3.4.0</span> (QEMU/KVM only)
</p>
</dd>
</dl>
</dd>
</dl>

View File

@ -3959,6 +3959,11 @@
<ref name="virOnOff"/>
</attribute>
</optional>
<optional>
<attribute name="eim">
<ref name="virOnOff"/>
</attribute>
</optional>
</element>
</optional>
</element>

View File

@ -14202,6 +14202,15 @@ virDomainIOMMUDefParseXML(xmlNodePtr node,
iommu->caching_mode = val;
}
VIR_FREE(tmp);
if ((tmp = virXPathString("string(./driver/@eim)", ctxt))) {
if ((val = virTristateSwitchTypeFromString(tmp)) < 0) {
virReportError(VIR_ERR_XML_ERROR, _("unknown eim value: %s"), tmp);
goto cleanup;
}
iommu->eim = val;
}
ret = iommu;
iommu = NULL;
@ -19920,6 +19929,14 @@ virDomainIOMMUDefCheckABIStability(virDomainIOMMUDefPtr src,
virTristateSwitchTypeToString(src->caching_mode));
return false;
}
if (src->eim != dst->eim) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Target domain IOMMU device eim value '%s' "
"does not match source '%s'"),
virTristateSwitchTypeToString(dst->eim),
virTristateSwitchTypeToString(src->eim));
return false;
}
return true;
}
@ -24238,6 +24255,10 @@ virDomainIOMMUDefFormat(virBufferPtr buf,
virBufferAsprintf(&childBuf, " caching_mode='%s'",
virTristateSwitchTypeToString(iommu->caching_mode));
}
if (iommu->eim != VIR_TRISTATE_SWITCH_ABSENT) {
virBufferAsprintf(&childBuf, " eim='%s'",
virTristateSwitchTypeToString(iommu->eim));
}
virBufferAddLit(&childBuf, "/>\n");
}

View File

@ -2211,6 +2211,7 @@ struct _virDomainIOMMUDef {
virDomainIOMMUModel model;
virTristateSwitch intremap;
virTristateSwitch caching_mode;
virTristateSwitch eim;
};
/*
* Guest VM main configuration

View File

@ -0,0 +1,31 @@
<domain type='kvm'>
<name>QEMUGuest1</name>
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
<memory unit='KiB'>219100</memory>
<currentMemory unit='KiB'>219100</currentMemory>
<vcpu placement='static'>288</vcpu>
<os>
<type arch='x86_64' machine='q35'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<ioapic driver='qemu'/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<controller type='pci' index='0' model='pcie-root'/>
<controller type='sata' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
</controller>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<memballoon model='none'/>
<iommu model='intel'>
<driver intremap='on' eim='on'/>
</iommu>
</devices>
</domain>

View File

@ -0,0 +1 @@
../qemuxml2argvdata/qemuxml2argv-intel-iommu-eim.xml

View File

@ -1127,6 +1127,7 @@ mymain(void)
QEMU_CAPS_MACHINE_IOMMU);
DO_TEST("intel-iommu-ioapic", NONE);
DO_TEST("intel-iommu-caching-mode", NONE);
DO_TEST("intel-iommu-eim", NONE);
DO_TEST("cpu-check-none", NONE);
DO_TEST("cpu-check-partial", NONE);