Accepting request 495126 from Virtualization

1

OBS-URL: https://build.opensuse.org/request/show/495126
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libvirt?expand=0&rev=228
This commit is contained in:
Dominique Leuenberger 2017-05-18 18:44:37 +00:00 committed by Git OBS Bridge
commit 44f3294ee7
16 changed files with 2246 additions and 32 deletions

View File

@ -0,0 +1,686 @@
commit 04028a9db9f2657e8d57d1e4705073c908aa248c
Author: Ján Tomko <jtomko@redhat.com>
Date: Wed May 3 15:23:12 2017 +0200
qemu: format intel-iommu,intremap on the command line
https://bugzilla.redhat.com/show_bug.cgi?id=1427005
Index: libvirt-3.3.0/src/qemu/qemu_capabilities.c
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_capabilities.c
+++ libvirt-3.3.0/src/qemu/qemu_capabilities.c
@@ -369,6 +369,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAS
"kernel-irqchip", /* 255 */
"kernel-irqchip.split",
+ "intel-iommu.intremap",
);
@@ -1720,6 +1721,10 @@ static struct virQEMUCapsStringFlags vir
{ "p3", QEMU_CAPS_NEC_USB_XHCI_PORTS },
};
+static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsIntelIOMMU[] = {
+ { "intremap", QEMU_CAPS_INTEL_IOMMU_INTREMAP },
+};
+
/* see documentation for virQEMUCapsQMPSchemaGetByPath for the query format */
static struct virQEMUCapsStringFlags virQEMUCapsQMPSchemaQueries[] = {
{ "blockdev-add/arg-type/options/+gluster/debug-level", QEMU_CAPS_GLUSTER_DEBUG_LEVEL},
@@ -1827,6 +1832,9 @@ static struct virQEMUCapsObjectTypeProps
{ "nec-usb-xhci", virQEMUCapsObjectPropsUSBNECXHCI,
ARRAY_CARDINALITY(virQEMUCapsObjectPropsUSBNECXHCI),
-1 },
+ { "intel-iommu", virQEMUCapsObjectPropsIntelIOMMU,
+ ARRAY_CARDINALITY(virQEMUCapsObjectPropsIntelIOMMU),
+ QEMU_CAPS_DEVICE_INTEL_IOMMU},
};
struct virQEMUCapsPropTypeObjects {
Index: libvirt-3.3.0/src/qemu/qemu_capabilities.h
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_capabilities.h
+++ libvirt-3.3.0/src/qemu/qemu_capabilities.h
@@ -407,6 +407,7 @@ typedef enum {
/* 255 */
QEMU_CAPS_MACHINE_KERNEL_IRQCHIP, /* -machine kernel_irqchip */
QEMU_CAPS_MACHINE_KERNEL_IRQCHIP_SPLIT, /* -machine kernel_irqchip=split */
+ QEMU_CAPS_INTEL_IOMMU_INTREMAP, /* intel-iommu.intremap */
QEMU_CAPS_LAST /* this must always be the last item */
} virQEMUCapsFlags;
Index: libvirt-3.3.0/src/qemu/qemu_command.c
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_command.c
+++ libvirt-3.3.0/src/qemu/qemu_command.c
@@ -6685,6 +6685,20 @@ qemuBuildIOMMUCommandLine(virCommandPtr
if (!iommu)
return 0;
+ switch (iommu->model) {
+ case VIR_DOMAIN_IOMMU_MODEL_INTEL:
+ if (iommu->intremap != VIR_TRISTATE_SWITCH_ABSENT &&
+ !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_INTREMAP)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("iommu: interrupt remapping is not supported "
+ "with this QEMU binary"));
+ return -1;
+ }
+ break;
+ case VIR_DOMAIN_IOMMU_MODEL_LAST:
+ break;
+ }
+
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_IOMMU))
return 0; /* Already handled via -machine */
@@ -6705,6 +6719,10 @@ qemuBuildIOMMUCommandLine(virCommandPtr
return -1;
}
virBufferAddLit(&opts, "intel-iommu");
+ if (iommu->intremap != VIR_TRISTATE_SWITCH_ABSENT) {
+ virBufferAsprintf(&opts, ",intremap=%s",
+ virTristateSwitchTypeToString(iommu->intremap));
+ }
case VIR_DOMAIN_IOMMU_MODEL_LAST:
break;
}
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.replies
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.replies
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.replies
@@ -3123,6 +3123,16 @@
{
"return": [
{
+ "name": "version",
+ "type": "uint32"
+ }
+ ],
+ "id": "libvirt-41"
+}
+
+{
+ "return": [
+ {
"name": "pc-i440fx-2.4",
"is-default": true,
"cpu-max": 255,
@@ -3246,7 +3256,7 @@
"cpu-max": 255
}
],
- "id": "libvirt-41"
+ "id": "libvirt-42"
}
{
@@ -3336,21 +3346,21 @@
"name": "qemu64"
}
],
- "id": "libvirt-42"
+ "id": "libvirt-43"
}
{
"return": [
"tpm-tis"
],
- "id": "libvirt-43"
+ "id": "libvirt-44"
}
{
"return": [
"passthrough"
],
- "id": "libvirt-44"
+ "id": "libvirt-45"
}
{
@@ -4358,7 +4368,7 @@
"option": "drive"
}
],
- "id": "libvirt-45"
+ "id": "libvirt-46"
}
{
@@ -4388,7 +4398,7 @@
"capability": "events"
}
],
- "id": "libvirt-46"
+ "id": "libvirt-47"
}
{
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.replies
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.replies
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.replies
@@ -3286,6 +3286,16 @@
{
"return": [
{
+ "name": "version",
+ "type": "uint32"
+ }
+ ],
+ "id": "libvirt-41"
+}
+
+{
+ "return": [
+ {
"name": "pc-i440fx-2.4",
"cpu-max": 255
},
@@ -3417,7 +3427,7 @@
"cpu-max": 255
}
],
- "id": "libvirt-41"
+ "id": "libvirt-42"
}
{
@@ -3507,21 +3517,21 @@
"name": "qemu64"
}
],
- "id": "libvirt-42"
+ "id": "libvirt-43"
}
{
"return": [
"tpm-tis"
],
- "id": "libvirt-43"
+ "id": "libvirt-44"
}
{
"return": [
"passthrough"
],
- "id": "libvirt-44"
+ "id": "libvirt-45"
}
{
@@ -4566,7 +4576,7 @@
"option": "drive"
}
],
- "id": "libvirt-45"
+ "id": "libvirt-46"
}
{
@@ -4600,7 +4610,7 @@
"capability": "x-postcopy-ram"
}
],
- "id": "libvirt-46"
+ "id": "libvirt-47"
}
{
@@ -12145,7 +12155,7 @@
"meta-type": "array"
}
],
- "id": "libvirt-47"
+ "id": "libvirt-48"
}
{
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.replies
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.replies
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.replies
@@ -3368,6 +3368,16 @@
{
"return": [
{
+ "name": "version",
+ "type": "uint32"
+ }
+ ],
+ "id": "libvirt-41"
+}
+
+{
+ "return": [
+ {
"name": "pc-0.12",
"cpu-max": 255
},
@@ -3475,7 +3485,7 @@
"cpu-max": 255
}
],
- "id": "libvirt-41"
+ "id": "libvirt-42"
}
{
@@ -3565,21 +3575,21 @@
"name": "qemu64"
}
],
- "id": "libvirt-42"
+ "id": "libvirt-43"
}
{
"return": [
"tpm-tis"
],
- "id": "libvirt-43"
+ "id": "libvirt-44"
}
{
"return": [
"passthrough"
],
- "id": "libvirt-44"
+ "id": "libvirt-45"
}
{
@@ -4673,7 +4683,7 @@
"option": "drive"
}
],
- "id": "libvirt-45"
+ "id": "libvirt-46"
}
{
@@ -4707,7 +4717,7 @@
"capability": "postcopy-ram"
}
],
- "id": "libvirt-46"
+ "id": "libvirt-47"
}
{
@@ -12712,7 +12722,7 @@
"meta-type": "array"
}
],
- "id": "libvirt-47"
+ "id": "libvirt-48"
}
{
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.replies
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.replies
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.replies
@@ -3559,6 +3559,20 @@
{
"return": [
{
+ "name": "version",
+ "type": "uint32"
+ },
+ {
+ "name": "intremap",
+ "type": "bool"
+ }
+ ],
+ "id": "libvirt-41"
+}
+
+{
+ "return": [
+ {
"hotpluggable-cpus": true,
"name": "pc-0.12",
"cpu-max": 255
@@ -3702,7 +3716,7 @@
"cpu-max": 255
}
],
- "id": "libvirt-41"
+ "id": "libvirt-42"
}
{
@@ -3795,21 +3809,21 @@
"name": "qemu64"
}
],
- "id": "libvirt-42"
+ "id": "libvirt-43"
}
{
"return": [
"tpm-tis"
],
- "id": "libvirt-43"
+ "id": "libvirt-44"
}
{
"return": [
"passthrough"
],
- "id": "libvirt-44"
+ "id": "libvirt-45"
}
{
@@ -4907,7 +4921,7 @@
"option": "drive"
}
],
- "id": "libvirt-45"
+ "id": "libvirt-46"
}
{
@@ -4941,7 +4955,7 @@
"capability": "postcopy-ram"
}
],
- "id": "libvirt-46"
+ "id": "libvirt-47"
}
{
@@ -13297,7 +13311,7 @@
"meta-type": "object"
}
],
- "id": "libvirt-47"
+ "id": "libvirt-48"
}
{
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
@@ -204,6 +204,7 @@
<flag name='query-named-block-nodes'/>
<flag name='kernel-irqchip'/>
<flag name='kernel-irqchip.split'/>
+ <flag name='intel-iommu.intremap'/>
<version>2007000</version>
<kvmVersion>0</kvmVersion>
<package> (v2.7.0)</package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.replies
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.replies
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.replies
@@ -3692,6 +3692,29 @@
{
"return": [
{
+ "name": "eim",
+ "description": "on/off/auto",
+ "type": "OnOffAuto"
+ },
+ {
+ "name": "x-buggy-eim",
+ "type": "bool"
+ },
+ {
+ "name": "intremap",
+ "type": "bool"
+ },
+ {
+ "name": "version",
+ "type": "uint32"
+ }
+ ],
+ "id": "libvirt-41"
+}
+
+{
+ "return": [
+ {
"hotpluggable-cpus": true,
"name": "pc-0.12",
"cpu-max": 255
@@ -3855,7 +3878,7 @@
"cpu-max": 255
}
],
- "id": "libvirt-41"
+ "id": "libvirt-42"
}
{
@@ -4061,21 +4084,21 @@
"static": false
}
],
- "id": "libvirt-42"
+ "id": "libvirt-43"
}
{
"return": [
"tpm-tis"
],
- "id": "libvirt-43"
+ "id": "libvirt-44"
}
{
"return": [
"passthrough"
],
- "id": "libvirt-44"
+ "id": "libvirt-45"
}
{
@@ -5198,7 +5221,7 @@
"option": "drive"
}
],
- "id": "libvirt-45"
+ "id": "libvirt-46"
}
{
@@ -5236,7 +5259,7 @@
"capability": "x-colo"
}
],
- "id": "libvirt-46"
+ "id": "libvirt-47"
}
{
@@ -14006,7 +14029,7 @@
"meta-type": "object"
}
],
- "id": "libvirt-47"
+ "id": "libvirt-48"
}
{
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
@@ -205,6 +205,7 @@
<flag name='query-named-block-nodes'/>
<flag name='kernel-irqchip'/>
<flag name='kernel-irqchip.split'/>
+ <flag name='intel-iommu.intremap'/>
<version>2008000</version>
<kvmVersion>0</kvmVersion>
<package> (v2.8.0)</package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.replies
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.replies
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.replies
@@ -4003,6 +4003,37 @@
{
"return": [
{
+ "name": "eim",
+ "description": "on/off/auto",
+ "type": "OnOffAuto"
+ },
+ {
+ "name": "caching-mode",
+ "type": "bool"
+ },
+ {
+ "name": "x-buggy-eim",
+ "type": "bool"
+ },
+ {
+ "name": "intremap",
+ "type": "bool"
+ },
+ {
+ "name": "version",
+ "type": "uint32"
+ },
+ {
+ "name": "device-iotlb",
+ "type": "bool"
+ }
+ ],
+ "id": "libvirt-41"
+}
+
+{
+ "return": [
+ {
"hotpluggable-cpus": true,
"name": "pc-0.12",
"cpu-max": 255
@@ -4176,7 +4207,7 @@
"cpu-max": 255
}
],
- "id": "libvirt-41"
+ "id": "libvirt-42"
}
{
@@ -4458,21 +4489,21 @@
"migration-safe": true
}
],
- "id": "libvirt-42"
+ "id": "libvirt-43"
}
{
"return": [
"tpm-tis"
],
- "id": "libvirt-43"
+ "id": "libvirt-44"
}
{
"return": [
"passthrough"
],
- "id": "libvirt-44"
+ "id": "libvirt-45"
}
{
@@ -5721,7 +5752,7 @@
"option": "drive"
}
],
- "id": "libvirt-45"
+ "id": "libvirt-46"
}
{
@@ -5763,7 +5794,7 @@
"capability": "release-ram"
}
],
- "id": "libvirt-46"
+ "id": "libvirt-47"
}
{
@@ -15049,7 +15080,7 @@
"meta-type": "object"
}
],
- "id": "libvirt-47"
+ "id": "libvirt-48"
}
{
@@ -15228,7 +15259,7 @@
}
}
},
- "id": "libvirt-48"
+ "id": "libvirt-49"
}
{
@@ -15469,7 +15500,7 @@
}
}
},
- "id": "libvirt-49"
+ "id": "libvirt-50"
}
{
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
@@ -212,6 +212,7 @@
<flag name='qemu-xhci'/>
<flag name='kernel-irqchip'/>
<flag name='kernel-irqchip.split'/>
+ <flag name='intel-iommu.intremap'/>
<version>2009000</version>
<kvmVersion>0</kvmVersion>
<package> (v2.9.0)</package>
Index: libvirt-3.3.0/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.args
===================================================================
--- libvirt-3.3.0.orig/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.args
+++ libvirt-3.3.0/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.args
@@ -16,4 +16,4 @@ QEMU_AUDIO_DRV=none \
-monitor unix:/tmp/lib/domain--1-QEMUGuest1/monitor.sock,server,nowait \
-no-acpi \
-boot c \
--device intel-iommu
+-device intel-iommu,intremap=on
Index: libvirt-3.3.0/tests/qemuxml2argvtest.c
===================================================================
--- libvirt-3.3.0.orig/tests/qemuxml2argvtest.c
+++ libvirt-3.3.0/tests/qemuxml2argvtest.c
@@ -2513,6 +2513,7 @@ mymain(void)
QEMU_CAPS_MACHINE_OPT,
QEMU_CAPS_MACHINE_KERNEL_IRQCHIP,
QEMU_CAPS_MACHINE_KERNEL_IRQCHIP_SPLIT,
+ QEMU_CAPS_INTEL_IOMMU_INTREMAP,
QEMU_CAPS_DEVICE_INTEL_IOMMU);
DO_TEST("cpu-hotplug-startup", QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS);

View File

@ -0,0 +1,185 @@
commit 2020e2c6f2656ca1aa9032859ccde76185c37c39
Author: Ján Tomko <jtomko@redhat.com>
Date: Fri Mar 17 08:35:22 2017 +0100
conf: add <driver intremap> to <iommu>
Add a new attribute to control interrupt remapping.
https://bugzilla.redhat.com/show_bug.cgi?id=1427005
Index: libvirt-3.3.0/docs/formatdomain.html.in
===================================================================
--- libvirt-3.3.0.orig/docs/formatdomain.html.in
+++ libvirt-3.3.0/docs/formatdomain.html.in
@@ -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>
Index: libvirt-3.3.0/docs/schemas/domaincommon.rng
===================================================================
--- libvirt-3.3.0.orig/docs/schemas/domaincommon.rng
+++ libvirt-3.3.0/docs/schemas/domaincommon.rng
@@ -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>
Index: libvirt-3.3.0/src/conf/domain_conf.c
===================================================================
--- libvirt-3.3.0.orig/src/conf/domain_conf.c
+++ libvirt-3.3.0/src/conf/domain_conf.c
@@ -14141,12 +14141,16 @@ virDomainMemoryDefParseXML(xmlNodePtr me
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 nod
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 *xmlS
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");
+ }
}
Index: libvirt-3.3.0/src/conf/domain_conf.h
===================================================================
--- libvirt-3.3.0.orig/src/conf/domain_conf.h
+++ libvirt-3.3.0/src/conf/domain_conf.h
@@ -2209,6 +2209,7 @@ typedef enum {
struct _virDomainIOMMUDef {
virDomainIOMMUModel model;
+ virTristateSwitch intremap;
};
/*
* Guest VM main configuration
Index: libvirt-3.3.0/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml
+++ libvirt-3.3.0/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml
@@ -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>

View File

@ -0,0 +1,49 @@
commit 3a276c6524026b661ed7bee4539fc5387b963611
Author: Ján Tomko <jtomko@redhat.com>
Date: Fri May 12 16:59:09 2017 +0200
conf: split out virDomainIOMMUDefCheckABIStability
Index: libvirt-3.3.0/src/conf/domain_conf.c
===================================================================
--- libvirt-3.3.0.orig/src/conf/domain_conf.c
+++ libvirt-3.3.0/src/conf/domain_conf.c
@@ -19819,6 +19819,22 @@ virDomainMemoryDefCheckABIStability(virD
static bool
+virDomainIOMMUDefCheckABIStability(virDomainIOMMUDefPtr src,
+ virDomainIOMMUDefPtr dst)
+{
+ if (src->model != dst->model) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target domain IOMMU device model '%s' "
+ "does not match source '%s'"),
+ virDomainIOMMUModelTypeToString(dst->model),
+ virDomainIOMMUModelTypeToString(src->model));
+ return false;
+ }
+ return true;
+}
+
+
+static bool
virDomainDefVcpuCheckAbiStability(virDomainDefPtr src,
virDomainDefPtr dst)
{
@@ -20284,14 +20300,8 @@ virDomainDefCheckABIStabilityFlags(virDo
}
if (src->iommu &&
- src->iommu->model != dst->iommu->model) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("Target domain IOMMU device model '%s' "
- "does not match source '%s'"),
- virDomainIOMMUModelTypeToString(dst->iommu->model),
- virDomainIOMMUModelTypeToString(src->iommu->model));
+ !virDomainIOMMUDefCheckABIStability(src->iommu, dst->iommu))
goto error;
- }
/* Coverity is not very happy with this - all dead_error_condition */
#if !STATIC_ANALYSIS

363
6b5c6314-qemu-irqchip.patch Normal file
View File

@ -0,0 +1,363 @@
commit 6b5c6314b2f7a3b54c94a591e6b0dcd13ef1c6ce
Author: Ján Tomko <jtomko@redhat.com>
Date: Fri Mar 17 08:26:49 2017 +0100
qemu: format kernel_irqchip on the command line
Add kernel_irqchip=split/on to the QEMU command line
and a capability that looks for it in query-command-line-options
output. For the 'split' option, use a version check
since it cannot be reasonably probed.
https://bugzilla.redhat.com/show_bug.cgi?id=1427005
Index: libvirt-3.3.0/src/qemu/qemu_capabilities.c
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_capabilities.c
+++ libvirt-3.3.0/src/qemu/qemu_capabilities.c
@@ -366,6 +366,9 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAS
"query-named-block-nodes",
"cpu-cache",
"qemu-xhci",
+
+ "kernel-irqchip", /* 255 */
+ "kernel-irqchip.split",
);
@@ -3127,6 +3130,7 @@ static struct virQEMUCapsCommandLineProp
{ "drive", "throttling.bps-total-max-length", QEMU_CAPS_DRIVE_IOTUNE_MAX_LENGTH },
{ "drive", "throttling.group", QEMU_CAPS_DRIVE_IOTUNE_GROUP },
{ "spice", "rendernode", QEMU_CAPS_SPICE_RENDERNODE },
+ { "machine", "kernel_irqchip", QEMU_CAPS_MACHINE_KERNEL_IRQCHIP },
};
static int
@@ -4739,6 +4743,10 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr
if (qemuCaps->version >= 2004050)
virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACH_VIRT_GIC_VERSION);
+ /* no way to query if -machine kernel_irqchip supports split */
+ if (qemuCaps->version >= 2006000)
+ virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_KERNEL_IRQCHIP_SPLIT);
+
if (virQEMUCapsProbeQMPCommands(qemuCaps, mon) < 0)
goto cleanup;
Index: libvirt-3.3.0/src/qemu/qemu_capabilities.h
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_capabilities.h
+++ libvirt-3.3.0/src/qemu/qemu_capabilities.h
@@ -404,6 +404,10 @@ typedef enum {
QEMU_CAPS_CPU_CACHE, /* -cpu supports host-cache-info and l3-cache properties */
QEMU_CAPS_DEVICE_QEMU_XHCI, /* -device qemu-xhci */
+ /* 255 */
+ QEMU_CAPS_MACHINE_KERNEL_IRQCHIP, /* -machine kernel_irqchip */
+ QEMU_CAPS_MACHINE_KERNEL_IRQCHIP_SPLIT, /* -machine kernel_irqchip=split */
+
QEMU_CAPS_LAST /* this must always be the last item */
} virQEMUCapsFlags;
Index: libvirt-3.3.0/src/qemu/qemu_command.c
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_command.c
+++ libvirt-3.3.0/src/qemu/qemu_command.c
@@ -7422,6 +7422,31 @@ qemuBuildMachineCommandLine(virCommandPt
}
}
+ if (def->features[VIR_DOMAIN_FEATURE_IOAPIC] == VIR_TRISTATE_SWITCH_ON) {
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_KERNEL_IRQCHIP)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("I/O APIC tuning is not supported by this "
+ "QEMU binary"));
+ goto cleanup;
+ }
+ switch (def->ioapic) {
+ case VIR_DOMAIN_IOAPIC_QEMU:
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_KERNEL_IRQCHIP_SPLIT)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("split I/O APIC is not supported by this "
+ "QEMU binary"));
+ goto cleanup;
+ }
+ virBufferAddLit(&buf, ",kernel_irqchip=split");
+ break;
+ case VIR_DOMAIN_IOAPIC_KVM:
+ virBufferAddLit(&buf, ",kernel_irqchip=on");
+ break;
+ case VIR_DOMAIN_IOAPIC_LAST:
+ break;
+ }
+ }
+
virCommandAddArgBuffer(cmd, &buf);
}
Index: libvirt-3.3.0/src/qemu/qemu_domain.c
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_domain.c
+++ libvirt-3.3.0/src/qemu/qemu_domain.c
@@ -2807,6 +2807,22 @@ qemuDomainDefCPUPostParse(virDomainDefPt
static int
+qemuDomainDefVerifyFeatures(const virDomainDef *def)
+{
+ if (def->features[VIR_DOMAIN_FEATURE_IOAPIC] == VIR_TRISTATE_SWITCH_ON &&
+ !ARCH_IS_X86(def->os.arch)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("I/O APIC tuning is not supported "
+ "for '%s' architecture"),
+ virArchToString(def->os.arch));
+ return -1;
+ }
+
+ return 0;
+}
+
+
+static int
qemuDomainDefPostParse(virDomainDefPtr def,
virCapsPtr caps,
unsigned int parseFlags,
@@ -2861,6 +2877,9 @@ qemuDomainDefPostParse(virDomainDefPtr d
qemuDomainDefEnableDefaultFeatures(def, qemuCaps);
+ if (qemuDomainDefVerifyFeatures(def) < 0)
+ goto cleanup;
+
if (qemuDomainRecheckInternalPaths(def, cfg, parseFlags) < 0)
goto cleanup;
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml
@@ -140,6 +140,7 @@
<flag name='display'/>
<flag name='vhost-scsi'/>
<flag name='query-cpu-definitions'/>
+ <flag name='kernel-irqchip'/>
<version>1005003</version>
<kvmVersion>0</kvmVersion>
<package></package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_1.6.0.x86_64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_1.6.0.x86_64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_1.6.0.x86_64.xml
@@ -145,6 +145,7 @@
<flag name='display'/>
<flag name='vhost-scsi'/>
<flag name='query-cpu-definitions'/>
+ <flag name='kernel-irqchip'/>
<version>1006000</version>
<kvmVersion>0</kvmVersion>
<package></package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_1.7.0.x86_64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_1.7.0.x86_64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_1.7.0.x86_64.xml
@@ -147,6 +147,7 @@
<flag name='display'/>
<flag name='vhost-scsi'/>
<flag name='query-cpu-definitions'/>
+ <flag name='kernel-irqchip'/>
<version>1007000</version>
<kvmVersion>0</kvmVersion>
<package></package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml
@@ -163,6 +163,7 @@
<flag name='vhost-scsi'/>
<flag name='query-cpu-definitions'/>
<flag name='query-named-block-nodes'/>
+ <flag name='kernel-irqchip'/>
<version>2001001</version>
<kvmVersion>0</kvmVersion>
<package></package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml
@@ -185,6 +185,7 @@
<flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<flag name='query-named-block-nodes'/>
+ <flag name='kernel-irqchip'/>
<version>2004000</version>
<kvmVersion>0</kvmVersion>
<package></package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
@@ -191,6 +191,7 @@
<flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<flag name='query-named-block-nodes'/>
+ <flag name='kernel-irqchip'/>
<version>2005000</version>
<kvmVersion>0</kvmVersion>
<package></package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
@@ -168,6 +168,8 @@
<flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<flag name='query-named-block-nodes'/>
+ <flag name='kernel-irqchip'/>
+ <flag name='kernel-irqchip.split'/>
<version>2006000</version>
<kvmVersion>0</kvmVersion>
<package></package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
@@ -168,6 +168,8 @@
<flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<flag name='query-named-block-nodes'/>
+ <flag name='kernel-irqchip'/>
+ <flag name='kernel-irqchip.split'/>
<version>2006000</version>
<kvmVersion>0</kvmVersion>
<package></package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml
@@ -162,6 +162,8 @@
<flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<flag name='query-named-block-nodes'/>
+ <flag name='kernel-irqchip'/>
+ <flag name='kernel-irqchip.split'/>
<version>2006000</version>
<kvmVersion>0</kvmVersion>
<package></package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
@@ -200,6 +200,8 @@
<flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<flag name='query-named-block-nodes'/>
+ <flag name='kernel-irqchip'/>
+ <flag name='kernel-irqchip.split'/>
<version>2006000</version>
<kvmVersion>0</kvmVersion>
<package></package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml
@@ -130,6 +130,8 @@
<flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<flag name='query-named-block-nodes'/>
+ <flag name='kernel-irqchip'/>
+ <flag name='kernel-irqchip.split'/>
<version>2007000</version>
<kvmVersion>0</kvmVersion>
<package></package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
@@ -202,6 +202,8 @@
<flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<flag name='query-named-block-nodes'/>
+ <flag name='kernel-irqchip'/>
+ <flag name='kernel-irqchip.split'/>
<version>2007000</version>
<kvmVersion>0</kvmVersion>
<package> (v2.7.0)</package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml
@@ -132,6 +132,8 @@
<flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<flag name='query-named-block-nodes'/>
+ <flag name='kernel-irqchip'/>
+ <flag name='kernel-irqchip.split'/>
<version>2007093</version>
<kvmVersion>0</kvmVersion>
<package></package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
@@ -203,6 +203,8 @@
<flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<flag name='query-named-block-nodes'/>
+ <flag name='kernel-irqchip'/>
+ <flag name='kernel-irqchip.split'/>
<version>2008000</version>
<kvmVersion>0</kvmVersion>
<package> (v2.8.0)</package>
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
@@ -210,6 +210,8 @@
<flag name='query-named-block-nodes'/>
<flag name='cpu-cache'/>
<flag name='qemu-xhci'/>
+ <flag name='kernel-irqchip'/>
+ <flag name='kernel-irqchip.split'/>
<version>2009000</version>
<kvmVersion>0</kvmVersion>
<package> (v2.9.0)</package>
Index: libvirt-3.3.0/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.args
===================================================================
--- /dev/null
+++ libvirt-3.3.0/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.args
@@ -0,0 +1,19 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-x86_64 \
+-name QEMUGuest1 \
+-S \
+-machine q35,accel=kvm,kernel_irqchip=split \
+-m 214 \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-nographic \
+-nodefaults \
+-monitor unix:/tmp/lib/domain--1-QEMUGuest1/monitor.sock,server,nowait \
+-no-acpi \
+-boot c \
+-device intel-iommu
Index: libvirt-3.3.0/tests/qemuxml2argvtest.c
===================================================================
--- libvirt-3.3.0.orig/tests/qemuxml2argvtest.c
+++ libvirt-3.3.0/tests/qemuxml2argvtest.c
@@ -2509,6 +2509,11 @@ mymain(void)
DO_TEST("intel-iommu-machine",
QEMU_CAPS_MACHINE_OPT,
QEMU_CAPS_MACHINE_IOMMU);
+ DO_TEST("intel-iommu-ioapic",
+ QEMU_CAPS_MACHINE_OPT,
+ QEMU_CAPS_MACHINE_KERNEL_IRQCHIP,
+ QEMU_CAPS_MACHINE_KERNEL_IRQCHIP_SPLIT,
+ QEMU_CAPS_DEVICE_INTEL_IOMMU);
DO_TEST("cpu-hotplug-startup", QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS);

229
8023b21a-conf-ioapic.patch Normal file
View File

@ -0,0 +1,229 @@
commit 8023b21a95f271e51810de7f1362e609eaadc1e4
Author: Ján Tomko <jtomko@redhat.com>
Date: Fri Mar 17 08:26:35 2017 +0100
conf: add <ioapic driver> to <features>
Add a new <ioapic> element with a driver attribute.
Possible values are qemu and kvm. With 'qemu', the I/O
APIC can be put in the userspace even for KVM domains.
https://bugzilla.redhat.com/show_bug.cgi?id=1427005
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 8c884f4af..bfc1df390 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1678,6 +1678,7 @@
&lt;/kvm&gt;
&lt;pvspinlock state='on'/&gt;
&lt;gic version='2'/&gt;
+ &lt;ioapic driver='qemu'/&gt;
&lt;/features&gt;
...</pre>
@@ -1839,6 +1840,14 @@
for hypervisor to decide.
<span class="since">Since 2.1.0</span>
</dd>
+ <dt><code>ioapic</code></dt>
+ <dd>Tune the I/O APIC. Possible values for the
+ <code>driver</code> attribute are:
+ <code>kvm</code> (default for KVM domains)
+ and <code>qemu</code> which puts I/O APIC in userspace
+ which is also known as a split I/O APIC mode.
+ <span class="since">Since 3.4.0</span> (QEMU/KVM only)
+ </dd>
</dl>
<h3><a name="elementsTime">Time keeping</a></h3>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 281309ec0..64f718b70 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -4569,6 +4569,9 @@
</optional>
</element>
</optional>
+ <optional>
+ <ref name="ioapic"/>
+ </optional>
</interleave>
</element>
</optional>
@@ -4747,6 +4750,18 @@
</element>
</define>
+ <define name="ioapic">
+ <element name="ioapic">
+ <attribute name="driver">
+ <choice>
+ <value>qemu</value>
+ <value>kvm</value>
+ </choice>
+ </attribute>
+ <empty/>
+ </element>
+ </define>
+
<define name="address">
<element name="address">
<choice>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 0ff216e3a..29b04d362 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -141,7 +141,8 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST,
"pmu",
"vmport",
"gic",
- "smm")
+ "smm",
+ "ioapic")
VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, VIR_DOMAIN_CAPABILITIES_POLICY_LAST,
"default",
@@ -859,6 +860,11 @@ VIR_ENUM_IMPL(virDomainLoader,
"rom",
"pflash")
+VIR_ENUM_IMPL(virDomainIOAPIC,
+ VIR_DOMAIN_IOAPIC_LAST,
+ "qemu",
+ "kvm")
+
/* Internal mapping: subset of block job types that can be present in
* <mirror> XML (remaining types are not two-phase). */
VIR_ENUM_DECL(virDomainBlockJob)
@@ -17527,6 +17533,24 @@ virDomainDefParseXML(xmlDocPtr xml,
ctxt->node = node;
break;
+ case VIR_DOMAIN_FEATURE_IOAPIC:
+ node = ctxt->node;
+ ctxt->node = nodes[i];
+ tmp = virXPathString("string(./@driver)", ctxt);
+ if (tmp) {
+ int value = virDomainIOAPICTypeFromString(tmp);
+ if (value < 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Unknown driver mode: %s"),
+ tmp);
+ goto error;
+ }
+ def->ioapic = value;
+ def->features[val] = VIR_TRISTATE_SWITCH_ON;
+ }
+ ctxt->node = node;
+ break;
+
/* coverity[dead_error_begin] */
case VIR_DOMAIN_FEATURE_LAST:
break;
@@ -24627,6 +24651,13 @@ virDomainDefFormatInternal(virDomainDefPtr def,
}
break;
+ case VIR_DOMAIN_FEATURE_IOAPIC:
+ if (def->features[i] == VIR_TRISTATE_SWITCH_ON) {
+ virBufferAsprintf(buf, "<ioapic driver='%s'/>\n",
+ virDomainIOAPICTypeToString(def->ioapic));
+ }
+ break;
+
/* coverity[dead_error_begin] */
case VIR_DOMAIN_FEATURE_LAST:
break;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 09fb7aada..82b4785a6 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1670,6 +1670,7 @@ typedef enum {
VIR_DOMAIN_FEATURE_VMPORT,
VIR_DOMAIN_FEATURE_GIC,
VIR_DOMAIN_FEATURE_SMM,
+ VIR_DOMAIN_FEATURE_IOAPIC,
VIR_DOMAIN_FEATURE_LAST
} virDomainFeature;
@@ -1809,6 +1810,15 @@ struct _virDomainLoaderDef {
void virDomainLoaderDefFree(virDomainLoaderDefPtr loader);
+typedef enum {
+ VIR_DOMAIN_IOAPIC_QEMU = 0,
+ VIR_DOMAIN_IOAPIC_KVM,
+
+ VIR_DOMAIN_IOAPIC_LAST
+} virDomainIOAPIC;
+
+VIR_ENUM_DECL(virDomainIOAPIC);
+
/* Operating system configuration data & machine / arch */
typedef struct _virDomainOSDef virDomainOSDef;
typedef virDomainOSDef *virDomainOSDefPtr;
@@ -2258,6 +2268,7 @@ struct _virDomainDef {
unsigned int hyperv_spinlocks;
virGICVersion gic_version;
char *hyperv_vendor_id;
+ virDomainIOAPIC ioapic;
/* These options are of type virTristateSwitch: ON = keep, OFF = drop */
int caps_features[VIR_DOMAIN_CAPS_FEATURE_LAST];
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml b/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml
new file mode 100644
index 000000000..284d63a30
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml
@@ -0,0 +1,29 @@
+<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'>1</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'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-ioapic.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-ioapic.xml
new file mode 120000
index 000000000..42d17b2c0
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-ioapic.xml
@@ -0,0 +1 @@
+../qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.xml
\ No newline at end of file
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 2dccde746..0f00b20d3 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -1122,6 +1122,7 @@ mymain(void)
DO_TEST("intel-iommu-machine",
QEMU_CAPS_MACHINE_OPT,
QEMU_CAPS_MACHINE_IOMMU);
+ DO_TEST("intel-iommu-ioapic", NONE);
DO_TEST("cpu-check-none", NONE);
DO_TEST("cpu-check-partial", NONE);

View File

@ -0,0 +1,52 @@
commit 935d927aa881753fff30f6236eedcf9680bca638
Author: Ján Tomko <jtomko@redhat.com>
Date: Fri May 12 16:59:45 2017 +0200
conf: add ABI stability checks for IOMMU options
https://bugzilla.redhat.com/show_bug.cgi?id=1427005
Index: libvirt-3.3.0/src/conf/domain_conf.c
===================================================================
--- libvirt-3.3.0.orig/src/conf/domain_conf.c
+++ libvirt-3.3.0/src/conf/domain_conf.c
@@ -19691,6 +19691,16 @@ virDomainDefFeaturesCheckABIStability(vi
}
}
+ /* ioapic */
+ if (src->ioapic != dst->ioapic) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("State of ioapic differs: "
+ "source: '%s', destination: '%s'"),
+ virDomainIOAPICTypeToString(src->ioapic),
+ virDomainIOAPICTypeToString(dst->ioapic));
+ return false;
+ }
+
return true;
}
@@ -19830,6 +19840,22 @@ virDomainIOMMUDefCheckABIStability(virDo
virDomainIOMMUModelTypeToString(src->model));
return false;
}
+ if (src->intremap != dst->intremap) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target domain IOMMU device intremap value '%s' "
+ "does not match source '%s'"),
+ virTristateSwitchTypeToString(dst->intremap),
+ virTristateSwitchTypeToString(src->intremap));
+ return false;
+ }
+ if (src->caching_mode != dst->caching_mode) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target domain IOMMU device caching mode '%s' "
+ "does not match source '%s'"),
+ virTristateSwitchTypeToString(dst->caching_mode),
+ virTristateSwitchTypeToString(src->caching_mode));
+ return false;
+ }
return true;
}

View File

@ -0,0 +1,136 @@
commit a56914486ca67f921ee6e3ce26b5787fccb47155
Author: Ján Tomko <jtomko@redhat.com>
Date: Fri Mar 17 08:28:04 2017 +0100
qemu: format caching-mode on iommu command line
Format the caching-mode option for the intel-iommu device,
based on its <driver caching> attribute value.
https://bugzilla.redhat.com/show_bug.cgi?id=1427005
Index: libvirt-3.3.0/src/qemu/qemu_capabilities.c
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_capabilities.c
+++ libvirt-3.3.0/src/qemu/qemu_capabilities.c
@@ -370,6 +370,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAS
"kernel-irqchip", /* 255 */
"kernel-irqchip.split",
"intel-iommu.intremap",
+ "intel-iommu.caching-mode",
);
@@ -1723,6 +1724,7 @@ static struct virQEMUCapsStringFlags vir
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsIntelIOMMU[] = {
{ "intremap", QEMU_CAPS_INTEL_IOMMU_INTREMAP },
+ { "caching-mode", QEMU_CAPS_INTEL_IOMMU_CACHING_MODE },
};
/* see documentation for virQEMUCapsQMPSchemaGetByPath for the query format */
Index: libvirt-3.3.0/src/qemu/qemu_capabilities.h
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_capabilities.h
+++ libvirt-3.3.0/src/qemu/qemu_capabilities.h
@@ -408,6 +408,7 @@ typedef enum {
QEMU_CAPS_MACHINE_KERNEL_IRQCHIP, /* -machine kernel_irqchip */
QEMU_CAPS_MACHINE_KERNEL_IRQCHIP_SPLIT, /* -machine kernel_irqchip=split */
QEMU_CAPS_INTEL_IOMMU_INTREMAP, /* intel-iommu.intremap */
+ QEMU_CAPS_INTEL_IOMMU_CACHING_MODE, /* intel-iommu.caching-mode */
QEMU_CAPS_LAST /* this must always be the last item */
} virQEMUCapsFlags;
Index: libvirt-3.3.0/src/qemu/qemu_command.c
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_command.c
+++ libvirt-3.3.0/src/qemu/qemu_command.c
@@ -6694,6 +6694,13 @@ qemuBuildIOMMUCommandLine(virCommandPtr
"with this QEMU binary"));
return -1;
}
+ if (iommu->caching_mode != VIR_TRISTATE_SWITCH_ABSENT &&
+ !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_CACHING_MODE)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("iommu: caching mode is not supported "
+ "with this QEMU binary"));
+ return -1;
+ }
break;
case VIR_DOMAIN_IOMMU_MODEL_LAST:
break;
@@ -6723,6 +6730,10 @@ qemuBuildIOMMUCommandLine(virCommandPtr
virBufferAsprintf(&opts, ",intremap=%s",
virTristateSwitchTypeToString(iommu->intremap));
}
+ if (iommu->caching_mode != VIR_TRISTATE_SWITCH_ABSENT) {
+ virBufferAsprintf(&opts, ",caching-mode=%s",
+ virTristateSwitchTypeToString(iommu->caching_mode));
+ }
case VIR_DOMAIN_IOMMU_MODEL_LAST:
break;
}
Index: libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
===================================================================
--- libvirt-3.3.0.orig/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
+++ libvirt-3.3.0/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
@@ -213,6 +213,7 @@
<flag name='kernel-irqchip'/>
<flag name='kernel-irqchip.split'/>
<flag name='intel-iommu.intremap'/>
+ <flag name='intel-iommu.caching-mode'/>
<version>2009000</version>
<kvmVersion>0</kvmVersion>
<package> (v2.9.0)</package>
Index: libvirt-3.3.0/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-caching-mode.args
===================================================================
--- /dev/null
+++ libvirt-3.3.0/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-caching-mode.args
@@ -0,0 +1,25 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-x86_64 \
+-name QEMUGuest1 \
+-S \
+-machine q35,accel=tcg \
+-m 214 \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-nographic \
+-nodefaults \
+-monitor unix:/tmp/lib/domain--1-QEMUGuest1/monitor.sock,server,nowait \
+-no-acpi \
+-boot c \
+-device intel-iommu,intremap=on,caching-mode=on \
+-device i82801b11-bridge,id=pci.1,bus=pcie.0,addr=0x1e \
+-device pci-bridge,chassis_nr=2,id=pci.2,bus=pci.1,addr=0x0 \
+-device ioh3420,port=0x10,chassis=3,id=pci.3,bus=pcie.0,addr=0x2 \
+-device ich9-usb-ehci1,id=usb,bus=pci.2,addr=0x2.0x7 \
+-device rtl8139,vlan=0,id=net0,mac=52:54:00:ab:0c:5c,bus=pci.2,addr=0x1 \
+-net user,vlan=0,name=hostnet0
Index: libvirt-3.3.0/tests/qemuxml2argvtest.c
===================================================================
--- libvirt-3.3.0.orig/tests/qemuxml2argvtest.c
+++ libvirt-3.3.0/tests/qemuxml2argvtest.c
@@ -2515,6 +2515,17 @@ mymain(void)
QEMU_CAPS_MACHINE_KERNEL_IRQCHIP_SPLIT,
QEMU_CAPS_INTEL_IOMMU_INTREMAP,
QEMU_CAPS_DEVICE_INTEL_IOMMU);
+ DO_TEST("intel-iommu-caching-mode",
+ QEMU_CAPS_MACHINE_OPT,
+ QEMU_CAPS_DEVICE_PCI_BRIDGE,
+ QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE,
+ QEMU_CAPS_DEVICE_IOH3420,
+ QEMU_CAPS_ICH9_AHCI,
+ QEMU_CAPS_PCI_MULTIFUNCTION,
+ QEMU_CAPS_ICH9_USB_EHCI1,
+ QEMU_CAPS_DEVICE_INTEL_IOMMU,
+ QEMU_CAPS_INTEL_IOMMU_INTREMAP,
+ QEMU_CAPS_INTEL_IOMMU_CACHING_MODE);
DO_TEST("cpu-hotplug-startup", QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS);

View File

@ -0,0 +1,55 @@
commit aeda1b8c56dc58b0a413acc61bbea938b40499e1
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Date: Thu Mar 9 10:54:32 2017 +0100
qemu: monitor: do not report error on shutdown
If a shutdown is expected because it was triggered via libvirt we can
also expect the monitor to close. In those cases do not report an
internal error like:
"internal error: End of file from qemu monitor"
Signed-off-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Index: libvirt-3.3.0/src/qemu/qemu_monitor.c
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_monitor.c
+++ libvirt-3.3.0/src/qemu/qemu_monitor.c
@@ -63,6 +63,7 @@ struct _qemuMonitor {
int fd;
int watch;
int hasSendFD;
+ int willhangup;
virDomainObjPtr vm;
@@ -693,8 +694,10 @@ qemuMonitorIO(int watch, int fd, int eve
if (events & VIR_EVENT_HANDLE_HANGUP) {
hangup = true;
if (!error) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("End of file from qemu monitor"));
+ if (!mon->willhangup) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("End of file from qemu monitor"));
+ }
eof = true;
events &= ~VIR_EVENT_HANDLE_HANGUP;
}
@@ -733,7 +736,7 @@ qemuMonitorIO(int watch, int fd, int eve
if (mon->lastError.code != VIR_ERR_OK) {
/* Already have an error, so clear any new error */
virResetLastError();
- } else {
+ } else if (!mon->willhangup) {
virErrorPtr err = virGetLastError();
if (!err)
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -1327,6 +1330,7 @@ qemuMonitorEmitShutdown(qemuMonitorPtr m
{
int ret = -1;
VIR_DEBUG("mon=%p", mon);
+ mon->willhangup = 1;
QEMU_MONITOR_CALLBACK(mon, ret, domainShutdown, mon->vm);
return ret;

View File

@ -0,0 +1,222 @@
commit d12781b47eb0c9f3a498d88b632c327aa08aaf8a
Author: Ján Tomko <jtomko@redhat.com>
Date: Fri Mar 17 08:27:49 2017 +0100
conf: add caching_mode attribute to iommu device
Add a new attribute to control the caching mode.
https://bugzilla.redhat.com/show_bug.cgi?id=1427005
Index: libvirt-3.3.0/docs/formatdomain.html.in
===================================================================
--- libvirt-3.3.0.orig/docs/formatdomain.html.in
+++ libvirt-3.3.0/docs/formatdomain.html.in
@@ -7427,6 +7427,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).
+ <span class="since">Since 3.4.0</span> (QEMU/KVM only)
+ </p>
+ </dd>
</dl>
</dd>
</dl>
Index: libvirt-3.3.0/docs/schemas/domaincommon.rng
===================================================================
--- libvirt-3.3.0.orig/docs/schemas/domaincommon.rng
+++ libvirt-3.3.0/docs/schemas/domaincommon.rng
@@ -3954,6 +3954,11 @@
<ref name="virOnOff"/>
</attribute>
</optional>
+ <optional>
+ <attribute name="caching_mode">
+ <ref name="virOnOff"/>
+ </attribute>
+ </optional>
</element>
</optional>
</element>
Index: libvirt-3.3.0/src/conf/domain_conf.c
===================================================================
--- libvirt-3.3.0.orig/src/conf/domain_conf.c
+++ libvirt-3.3.0/src/conf/domain_conf.c
@@ -14176,6 +14176,15 @@ virDomainIOMMUDefParseXML(xmlNodePtr nod
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 != VIR_TRISTATE_SWITCH_ABSENT) {
+ 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'",
Index: libvirt-3.3.0/src/conf/domain_conf.h
===================================================================
--- libvirt-3.3.0.orig/src/conf/domain_conf.h
+++ libvirt-3.3.0/src/conf/domain_conf.h
@@ -2210,6 +2210,7 @@ typedef enum {
struct _virDomainIOMMUDef {
virDomainIOMMUModel model;
virTristateSwitch intremap;
+ virTristateSwitch caching_mode;
};
/*
* Guest VM main configuration
Index: libvirt-3.3.0/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-caching-mode.xml
===================================================================
--- /dev/null
+++ libvirt-3.3.0/tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-caching-mode.xml
@@ -0,0 +1,50 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='q35'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <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='pci' index='1' model='dmi-to-pci-bridge'>
+ <model name='i82801b11-bridge'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x1e' function='0x0'/>
+ </controller>
+ <controller type='pci' index='2' model='pci-bridge'>
+ <model name='pci-bridge'/>
+ <target chassisNr='2'/>
+ <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
+ </controller>
+ <controller type='pci' index='3' model='pcie-root-port'>
+ <model name='ioh3420'/>
+ <target chassis='3' port='0x10'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </controller>
+ <controller type='sata' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
+ </controller>
+ <controller type='usb' index='0' model='ich9-ehci1'>
+ <address type='pci' domain='0x0000' bus='0x02' slot='0x02' function='0x7'/>
+ </controller>
+ <interface type='user'>
+ <mac address='52:54:00:ab:0c:5c'/>
+ <model type='rtl8139'/>
+ <address type='pci' domain='0x0000' bus='0x02' slot='0x01' function='0x0'/>
+ </interface>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <memballoon model='none'/>
+ <iommu model='intel'>
+ <driver intremap='on' caching_mode='on'/>
+ </iommu>
+ </devices>
+</domain>
Index: libvirt-3.3.0/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-caching-mode.xml
===================================================================
--- /dev/null
+++ libvirt-3.3.0/tests/qemuxml2xmloutdata/qemuxml2xmlout-intel-iommu-caching-mode.xml
@@ -0,0 +1,50 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='q35'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <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='pci' index='1' model='dmi-to-pci-bridge'>
+ <model name='i82801b11-bridge'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x1e' function='0x0'/>
+ </controller>
+ <controller type='pci' index='2' model='pci-bridge'>
+ <model name='pci-bridge'/>
+ <target chassisNr='2'/>
+ <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
+ </controller>
+ <controller type='pci' index='3' model='pcie-root-port'>
+ <model name='ioh3420'/>
+ <target chassis='3' port='0x10'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </controller>
+ <controller type='sata' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
+ </controller>
+ <controller type='usb' index='0' model='ich9-ehci1'>
+ <address type='pci' domain='0x0000' bus='0x02' slot='0x02' function='0x7'/>
+ </controller>
+ <interface type='user'>
+ <mac address='52:54:00:ab:0c:5c'/>
+ <model type='rtl8139'/>
+ <address type='pci' domain='0x0000' bus='0x02' slot='0x01' function='0x0'/>
+ </interface>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <memballoon model='none'/>
+ <iommu model='intel'>
+ <driver intremap='on' caching_mode='on'/>
+ </iommu>
+ </devices>
+</domain>
Index: libvirt-3.3.0/tests/qemuxml2xmltest.c
===================================================================
--- libvirt-3.3.0.orig/tests/qemuxml2xmltest.c
+++ libvirt-3.3.0/tests/qemuxml2xmltest.c
@@ -1123,6 +1123,7 @@ mymain(void)
QEMU_CAPS_MACHINE_OPT,
QEMU_CAPS_MACHINE_IOMMU);
DO_TEST("intel-iommu-ioapic", NONE);
+ DO_TEST("intel-iommu-caching-mode", NONE);
DO_TEST("cpu-check-none", NONE);
DO_TEST("cpu-check-partial", NONE);

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ad7af06eca75aee2e347618157fd392f1fef3f4eec275110a6cf1b61b5ca446f oid sha256:29e00984174e33cf2183b478382c017de26860452ffee17b73871051264ebb1b
size 13985032 size 14043384

View File

@ -1,11 +1,10 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQEzBAABCAAdFiEEjUiKECNx2wGgDcvNZNVaFdrgLsAFAlkDS5gACgkQZNVaFdrg iQEcBAABAgAGBQJZDNY6AAoJEBVYiyZZa+pdBgEIAKfTozMEi/ZI2NTtpjoZXzDn
LsDmOwf/eajUbk983Ka+iLGHgCul13X3u90UeOkCeqF1Ek95/driVMTOrY9sAHLP gGcSEAZUJj3Chp9LkY/daAgL8RCNKU3c9Y/QgmTflJYEsAZsIRW9rJ3zsCHfPnC1
luBavdmsCUQS3y3mzv5h/pJMt9IQq7NSA01PxLExEJWbULIzULr7ac+SoNZe6l9v rty3NulfCujrsLsZEqXHADjbmiTQ/H7WUoStIPBYLkERxrZ+qQ0egsA6qSqe8hy5
DPKmW9x/Zg0C5G4i0AFfq6exitjPKOA/p+kukHEHCQ5r1jkgSv09zxch9nEfa0PU 6u/cXm8Yav9QvIfp8ikdKcJl+SUQT/yGXXzR7udr/ra8rCfqgvJqKkg+NDLNXB17
VuJ/nQga/ePLpW2Kk8yvawY0JjCaU6FTdk5u+iHAY+U4Z/ryYqe+35cbDQHSkgbg kAz4guvjivfAOEel1RASoTyvnXjLzMtG4InfTz0+8cGomLDS1sWmCW+gW519juPm
jHgY0WZC22fxq+BIyBNO/bxawdIeDQcv66HYJodLZxM4HdvcpNuBF67zEO7vF0XF 6TaHbQ1hDnLZvCy3h7TmeUJxLgvyV8Ul2VlZRCytXlJ//IcVlvgDq2+7SpBvjgA=
lKFyN94x5uBpqjT0JVbhkHbWENkp9w== =fQOM
=0rmS
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View File

@ -1,3 +1,34 @@
-------------------------------------------------------------------
Mon May 15 21:21:56 UTC 2017 - jfehlig@suse.com
- qemu: add support for 288 VCPUS
aeda1b8c-qemu-no-error-shutdown.patch,
8023b21a-conf-ioapic.patch,
6b5c6314-qemu-irqchip.patch,
2020e2c6-conf-intremap.patch,
04028a9d-qemu-intremap.patch,
d12781b4-conf-iommu-cache-mode-attr.patch,
a5691448-qemu-iommu-cache-mode.patch,
3a276c65-conf-iommu-def-stability-check.patch,
935d927a-conf-iommu-ABI-stability-check.patch
FATE#321335
- revert commit 2841e675: qemu: propagate bridge MTU into qemu
"host_mtu"
revert-2841e675-mtu.patch
bsc#1037774
-------------------------------------------------------------------
Mon May 8 16:44:59 UTC 2017 - jfehlig@suse.com
- Update to libvirt 3.3.0
- Many incremental improvements and bug fixes, see
http://libvirt.org/news.html
- Bug fixes:
bsc#978121, bsc#1017017, bsc#1032863, bsc#1033117, bsc#1034024,
bsc#1034146, bsc#1035995
- libxl: updated libxl-def-usbctrl.patch
bsc#1031056
------------------------------------------------------------------- -------------------------------------------------------------------
Fri Apr 28 03:30:51 UTC 2017 - jfehlig@suse.com Fri Apr 28 03:30:51 UTC 2017 - jfehlig@suse.com

View File

@ -317,6 +317,15 @@ Source4: libvirtd-relocation-server.fw
Source99: baselibs.conf Source99: baselibs.conf
Source100: %{name}-rpmlintrc Source100: %{name}-rpmlintrc
# Upstream patches # Upstream patches
Patch0: aeda1b8c-qemu-no-error-shutdown.patch
Patch1: 8023b21a-conf-ioapic.patch
Patch2: 6b5c6314-qemu-irqchip.patch
Patch3: 2020e2c6-conf-intremap.patch
Patch4: 04028a9d-qemu-intremap.patch
Patch5: d12781b4-conf-iommu-cache-mode-attr.patch
Patch6: a5691448-qemu-iommu-cache-mode.patch
Patch7: 3a276c65-conf-iommu-def-stability-check.patch
Patch8: 935d927a-conf-iommu-ABI-stability-check.patch
# Patches pending upstream review # Patches pending upstream review
Patch100: libxl-dom-reset.patch Patch100: libxl-dom-reset.patch
Patch101: network-don-t-use-dhcp-authoritative-on-static-netwo.patch Patch101: network-don-t-use-dhcp-authoritative-on-static-netwo.patch
@ -329,6 +338,7 @@ Patch153: ppc64le-canonical-name.patch
Patch154: libxl-set-migration-constraints.patch Patch154: libxl-set-migration-constraints.patch
Patch155: libxl-set-cach-mode.patch Patch155: libxl-set-cach-mode.patch
Patch156: apparmor-fixes.patch Patch156: apparmor-fixes.patch
Patch157: revert-2841e675-mtu.patch
# Our patches # Our patches
Patch200: libvirtd-defaults.patch Patch200: libvirtd-defaults.patch
Patch201: libvirtd-init-script.patch Patch201: libvirtd-init-script.patch
@ -886,6 +896,15 @@ libvirt plugin for NSS for translating domain names into IP addresses.
%prep %prep
%setup -q %setup -q
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch100 -p1 %patch100 -p1
%patch101 -p1 %patch101 -p1
%patch102 -p1 %patch102 -p1
@ -896,6 +915,7 @@ libvirt plugin for NSS for translating domain names into IP addresses.
%patch154 -p1 %patch154 -p1
%patch155 -p1 %patch155 -p1
%patch156 -p1 %patch156 -p1
%patch157 -p1
%patch200 -p1 %patch200 -p1
%patch201 -p1 %patch201 -p1
%patch202 -p1 %patch202 -p1

View File

@ -1,29 +1,33 @@
commit b020800a3930aa2bd40855548c442846716d88f1 From c55c2ba0a26b0074e73f281810ad3e4a70bc4910 Mon Sep 17 00:00:00 2001
Author: Jim Fehlig <jfehlig@suse.com> From: Jim Fehlig <jfehlig@suse.com>
Date: Tue Mar 28 17:34:16 2017 -0600 Date: Tue, 28 Mar 2017 17:34:16 -0600
Subject: [PATCH] libxl: add default controllers for USB devices
libxl: add default controllers for USB devices Attempting to start a domain with USB hostdevs but no USB controllers
fails with the rather cryptic error
Attempting to start a domain with USB hostdevs but no USB controllers libxl: error: libxl_qmp.c:287:qmp_handle_error_response: received an
fails with the rather cryptic error error message from QMP server: Bus 'xenusb-0.0' not found
libxl: error: libxl_qmp.c:287:qmp_handle_error_response: received an This can be fixed by creating default USB controllers. When no USB
error message from QMP server: Bus 'xenusb-0.0' not found controllers are defined, create the number of 8 port controllers
necessary to accommodate the number of defined USB devices.
This can be fixed by creating default USB controllers. When no USB Note that USB controllers are already created as needed in the
controllers are defined, create the number of 8 port controllers domainAttachDevice code path. E.g. a USB controller will be created,
necessary to accommodate the number of defined USB devices. if necessary, when attaching a USB device with
'virsh attach-device dom usbdev.xml'.
Note that USB controllers are already created as needed in the Signed-off-by: Jim Fehlig <jfehlig@suse.com>
domainAttachDevice code path. E.g. a USB controller will be created, ---
if necessary, when attaching a USB device with src/libxl/libxl_conf.c | 82 +++++++++++++++++++++++++++++++++++++++++++-------
'virsh attach-device dom usbdev.xml'. 1 file changed, 71 insertions(+), 11 deletions(-)
Index: libvirt-3.3.0/src/libxl/libxl_conf.c Index: libvirt-3.3.0/src/libxl/libxl_conf.c
=================================================================== ===================================================================
--- libvirt-3.3.0.orig/src/libxl/libxl_conf.c --- libvirt-3.3.0.orig/src/libxl/libxl_conf.c
+++ libvirt-3.3.0/src/libxl/libxl_conf.c +++ libvirt-3.3.0/src/libxl/libxl_conf.c
@@ -1822,34 +1822,92 @@ libxlMakeUSBController(virDomainControll @@ -1822,34 +1822,94 @@ libxlMakeUSBController(virDomainControll
} }
static int static int
@ -64,7 +68,9 @@ Index: libvirt-3.3.0/src/libxl/libxl_conf.c
+ if (libxlMakeUSBController(l_controller, &x_controllers[i]) < 0) + if (libxlMakeUSBController(l_controller, &x_controllers[i]) < 0)
+ goto error; + goto error;
+ +
+ virDomainControllerInsertPreAlloced(def, l_controller); + if (virDomainControllerInsert(def, l_controller) < 0)
+ goto error;
+
+ l_controller = NULL; + l_controller = NULL;
+ } + }
+ +

View File

@ -378,7 +378,7 @@ Index: libvirt-3.3.0/tools/virsh.pod
=================================================================== ===================================================================
--- libvirt-3.3.0.orig/tools/virsh.pod --- libvirt-3.3.0.orig/tools/virsh.pod
+++ libvirt-3.3.0/tools/virsh.pod +++ libvirt-3.3.0/tools/virsh.pod
@@ -1752,6 +1752,14 @@ compression. I<--comp-mt-threads> and I< @@ -1753,6 +1753,14 @@ compression. I<--comp-mt-threads> and I<
of compress threads on source and the number of decompress threads on target of compress threads on source and the number of decompress threads on target
respectively. I<--comp-xbzrle-cache> sets size of page cache in bytes. respectively. I<--comp-xbzrle-cache> sets size of page cache in bytes.

181
revert-2841e675-mtu.patch Normal file
View File

@ -0,0 +1,181 @@
From 306b412857870d1952850b511011909066089af7 Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
Date: Mon, 15 May 2017 09:47:39 -0600
Subject: [PATCH] Revert "qemu: propagate bridge MTU into qemu "host_mtu"
option"
This reverts commit 2841e6756d5807a4119e004bc5fb8e7d70806458.
The change causes a guest ABI change. See following bugs for details
https://bugzilla.suse.com/show_bug.cgi?id=1037774
https://bugzilla.redhat.com/show_bug.cgi?id=1449346
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
---
src/qemu/qemu_command.c | 32 ++++++++++----------------------
src/qemu/qemu_command.h | 3 +--
src/qemu/qemu_hotplug.c | 5 ++---
src/qemu/qemu_interface.c | 5 ++---
src/qemu/qemu_interface.h | 3 +--
5 files changed, 16 insertions(+), 32 deletions(-)
Index: libvirt-3.3.0/src/qemu/qemu_command.c
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_command.c
+++ libvirt-3.3.0/src/qemu/qemu_command.c
@@ -3633,8 +3633,7 @@ qemuBuildNicDevStr(virDomainDefPtr def,
int vlan,
unsigned int bootindex,
size_t vhostfdSize,
- virQEMUCapsPtr qemuCaps,
- unsigned int mtu)
+ virQEMUCapsPtr qemuCaps)
{
virBuffer buf = VIR_BUFFER_INITIALIZER;
const char *nic = net->model;
@@ -3758,23 +3757,13 @@ qemuBuildNicDevStr(virDomainDefPtr def,
virBufferAsprintf(&buf, ",rx_queue_size=%u", net->driver.virtio.rx_queue_size);
}
- if (usingVirtio && mtu) {
- if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_HOST_MTU)) {
-
- virBufferAsprintf(&buf, ",host_mtu=%u", mtu);
-
- } else {
- /* log an error if mtu was requested specifically for this
- * interface, otherwise, if it's just what was reported by
- * the attached network, ignore it.
- */
- if (net->mtu) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("setting MTU is not supported with "
- "this QEMU binary"));
- goto error;
- }
+ if (usingVirtio && net->mtu) {
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_HOST_MTU)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("setting MTU is not supported with this QEMU binary"));
+ goto error;
}
+ virBufferAsprintf(&buf, ",host_mtu=%u", net->mtu);
}
if (vlan == -1)
@@ -8320,7 +8309,7 @@ qemuBuildVhostuserCommandLine(virQEMUDri
VIR_FREE(netdev);
if (!(nic = qemuBuildNicDevStr(def, net, -1, bootindex,
- queues, qemuCaps, net->mtu))) {
+ queues, qemuCaps))) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("Error generating NIC -device string"));
goto error;
@@ -8366,7 +8355,6 @@ qemuBuildInterfaceCommandLine(virQEMUDri
virDomainNetType actualType = virDomainNetGetActualType(net);
virNetDevBandwidthPtr actualBandwidth;
size_t i;
- unsigned int mtu = net->mtu;
if (!bootindex)
@@ -8421,7 +8409,7 @@ qemuBuildInterfaceCommandLine(virQEMUDri
memset(tapfd, -1, tapfdSize * sizeof(tapfd[0]));
if (qemuInterfaceBridgeConnect(def, driver, net,
- tapfd, &tapfdSize, &mtu) < 0)
+ tapfd, &tapfdSize) < 0)
goto cleanup;
break;
@@ -8601,7 +8589,7 @@ qemuBuildInterfaceCommandLine(virQEMUDri
}
if (qemuDomainSupportsNicdev(def, net)) {
if (!(nic = qemuBuildNicDevStr(def, net, vlan, bootindex,
- vhostfdSize, qemuCaps, mtu)))
+ vhostfdSize, qemuCaps)))
goto cleanup;
virCommandAddArgList(cmd, "-device", nic, NULL);
} else {
Index: libvirt-3.3.0/src/qemu/qemu_command.h
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_command.h
+++ libvirt-3.3.0/src/qemu/qemu_command.h
@@ -101,8 +101,7 @@ char *qemuBuildNicDevStr(virDomainDefPtr
int vlan,
unsigned int bootindex,
size_t vhostfdSize,
- virQEMUCapsPtr qemuCaps,
- unsigned int mtu);
+ virQEMUCapsPtr qemuCaps);
char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk);
Index: libvirt-3.3.0/src/qemu/qemu_hotplug.c
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_hotplug.c
+++ libvirt-3.3.0/src/qemu/qemu_hotplug.c
@@ -968,7 +968,6 @@ qemuDomainAttachNetDevice(virQEMUDriverP
bool charDevPlugged = false;
bool netdevPlugged = false;
bool hostPlugged = false;
- unsigned int mtu = net->mtu;
/* preallocate new slot for device */
if (VIR_REALLOC_N(vm->def->nets, vm->def->nnets + 1) < 0)
@@ -1025,7 +1024,7 @@ qemuDomainAttachNetDevice(virQEMUDriverP
goto cleanup;
memset(vhostfd, -1, sizeof(*vhostfd) * vhostfdSize);
if (qemuInterfaceBridgeConnect(vm->def, driver, net,
- tapfd, &tapfdSize, &mtu) < 0)
+ tapfd, &tapfdSize) < 0)
goto cleanup;
iface_connected = true;
if (qemuInterfaceOpenVhostNet(vm->def, net, priv->qemuCaps,
@@ -1239,7 +1238,7 @@ qemuDomainAttachNetDevice(virQEMUDriverP
VIR_FORCE_CLOSE(vhostfd[i]);
if (!(nicstr = qemuBuildNicDevStr(vm->def, net, vlan, 0,
- queueSize, priv->qemuCaps, mtu)))
+ queueSize, priv->qemuCaps)))
goto try_remove;
qemuDomainObjEnterMonitor(driver, vm);
Index: libvirt-3.3.0/src/qemu/qemu_interface.c
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_interface.c
+++ libvirt-3.3.0/src/qemu/qemu_interface.c
@@ -503,8 +503,7 @@ qemuInterfaceBridgeConnect(virDomainDefP
virQEMUDriverPtr driver,
virDomainNetDefPtr net,
int *tapfd,
- size_t *tapfdSize,
- unsigned int *mtu)
+ size_t *tapfdSize)
{
const char *brname;
int ret = -1;
@@ -545,7 +544,7 @@ qemuInterfaceBridgeConnect(virDomainDefP
def->uuid, tunpath, tapfd, *tapfdSize,
virDomainNetGetActualVirtPortProfile(net),
virDomainNetGetActualVlan(net),
- net->coalesce, net->mtu, mtu,
+ NULL, 0, NULL,
tap_create_flags) < 0) {
virDomainAuditNetDevice(def, net, tunpath, false);
goto cleanup;
Index: libvirt-3.3.0/src/qemu/qemu_interface.h
===================================================================
--- libvirt-3.3.0.orig/src/qemu/qemu_interface.h
+++ libvirt-3.3.0/src/qemu/qemu_interface.h
@@ -51,8 +51,7 @@ int qemuInterfaceBridgeConnect(virDomain
virQEMUDriverPtr driver,
virDomainNetDefPtr net,
int *tapfd,
- size_t *tapfdSize,
- unsigned int *mtu)
+ size_t *tapfdSize)
ATTRIBUTE_NONNULL(2);
int qemuInterfaceOpenVhostNet(virDomainDefPtr def,