From: Marc-André Lureau <marcandre.lureau(a)redhat.com>
Accept a new driver name attribute to specify usage of helper process, ex:
<video>
<driver name='vhostuser'/>
<model type='virtio'/>
</video>
Signed-off-by: Marc-André Lureau <marcandre.lureau(a)redhat.com>
---
docs/formatdomain.html.in | 12 ++++++-
docs/schemas/domaincommon.rng | 8 +++++
src/conf/domain_conf.c | 42 ++++++++++++++++++++++-
src/conf/domain_conf.h | 12 +++++++
tests/qemuxml2argvdata/virtio-options.xml | 2 +-
5 files changed, 73 insertions(+), 3 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index fcb7c59c00..f56d04eac3 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -6969,6 +6969,7 @@ qemu-kvm -net nic,model=? /dev/null
<model type='vga' vram='16384' heads='1'>
<acceleration accel3d='yes' accel2d='yes'/>
</model>
+ <driver name='qemu'/>
</video>
</devices>
...</pre>
@@ -7069,7 +7070,16 @@ qemu-kvm -net nic,model=? /dev/null
<dd>
The subelement <code>driver</code> can be used to tune the device:
<dl>
- <dt>virtio options</dt>
+ <dt><code>name</code></dt>
+ <dd>
+ Specify the backend driver to use, either "qemu" or
+ "vhostuser" depending on the hypervisor features available
+ (<span class="since">since 5.8.0</span>).
"qemu" is the
+ default QEMU backend. "vhostuser" will use a separate
+ vhost-user process backend (for <code>virtio</code>
+ device).
+ </dd>
+ <dt>virtio options</dt>
<dd>
<a href="#elementsVirtio">Virtio-specific options</a> can
also be
set (<span class="since">Since 3.5.0</span>)
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index c48f8c4f56..7e0b63f0a6 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3560,6 +3560,14 @@
<optional>
<ref name="virtioOptions"/>
</optional>
+ <optional>
+ <attribute name="name">
+ <choice>
+ <value>qemu</value>
+ <value>vhostuser</value>
+ </choice>
+ </attribute>
+ </optional>
<optional>
<attribute name="vgaconf">
<choice>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index b7a342bb91..dc5b7eac5c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -728,6 +728,13 @@ VIR_ENUM_IMPL(virDomainPanicModel,
"s390",
);
+VIR_ENUM_IMPL(virDomainVideoBackend,
+ VIR_DOMAIN_VIDEO_BACKEND_TYPE_LAST,
+ "default",
+ "qemu",
+ "vhostuser",
+);
+
VIR_ENUM_IMPL(virDomainVideo,
VIR_DOMAIN_VIDEO_TYPE_LAST,
"default",
@@ -6249,6 +6256,23 @@ virDomainVideoDefValidate(const virDomainVideoDef *video,
}
}
+ switch (video->backend) {
+ case VIR_DOMAIN_VIDEO_BACKEND_TYPE_VHOSTUSER:
+ if (video->type != VIR_DOMAIN_VIDEO_TYPE_VIRTIO) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("'vhostuser' driver is only supported with
'virtio' device"));
+ return -1;
+ }
+ break;
+ case VIR_DOMAIN_VIDEO_BACKEND_TYPE_DEFAULT:
+ case VIR_DOMAIN_VIDEO_BACKEND_TYPE_QEMU:
+ break;
+ case VIR_DOMAIN_VIDEO_BACKEND_TYPE_LAST:
+ default:
+ virReportEnumRangeError(virDomainInputType, video->backend);
+ return -1;
+ }
+
return 0;
}
@@ -15358,6 +15382,7 @@ virDomainVideoDefParseXML(virDomainXMLOptionPtr xmlopt,
xmlNodePtr cur;
VIR_XPATH_NODE_AUTORESTORE(ctxt);
VIR_AUTOFREE(char *) type = NULL;
+ VIR_AUTOFREE(char *) driver_name = NULL;
VIR_AUTOFREE(char *) heads = NULL;
VIR_AUTOFREE(char *) vram = NULL;
VIR_AUTOFREE(char *) vram64 = NULL;
@@ -15393,6 +15418,7 @@ virDomainVideoDefParseXML(virDomainXMLOptionPtr xmlopt,
if (virXMLNodeNameEqual(cur, "driver")) {
if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0)
goto error;
+ driver_name = virXMLPropString(cur, "name");
}
}
cur = cur->next;
@@ -15408,6 +15434,16 @@ virDomainVideoDefParseXML(virDomainXMLOptionPtr xmlopt,
def->type = virDomainVideoDefaultType(dom);
}
+ if (driver_name) {
+ if ((def->backend = virDomainVideoBackendTypeFromString(driver_name)) < 0)
{
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("unknown video driver '%s'"),
driver_name);
+ goto error;
+ }
+ } else {
+ def->backend = VIR_DOMAIN_VIDEO_BACKEND_TYPE_DEFAULT;
+ }
+
if (ram) {
if (def->type != VIR_DOMAIN_VIDEO_TYPE_QXL) {
virReportError(VIR_ERR_XML_ERROR, "%s",
@@ -26463,13 +26499,17 @@ virDomainVideoDefFormat(virBufferPtr buf,
virDomainVirtioOptionsFormat(&driverBuf, def->virtio);
if (virBufferCheckError(&driverBuf) < 0)
goto cleanup;
- if (virBufferUse(&driverBuf) || (def->driver &&
def->driver->vgaconf)) {
+ if (virBufferUse(&driverBuf) || (def->driver &&
def->driver->vgaconf) ||
+ def->backend != VIR_DOMAIN_VIDEO_BACKEND_TYPE_DEFAULT) {
virBufferAddLit(buf, "<driver");
if (virBufferUse(&driverBuf))
virBufferAddBuffer(buf, &driverBuf);
if (def->driver && def->driver->vgaconf)
virBufferAsprintf(buf, " vgaconf='%s'",
virDomainVideoVGAConfTypeToString(def->driver->vgaconf));
+ if (def->backend != VIR_DOMAIN_VIDEO_BACKEND_TYPE_DEFAULT)
+ virBufferAsprintf(buf, " name='%s'",
+ virDomainVideoBackendTypeToString(def->backend));
virBufferAddLit(buf, "/>\n");
}
virBufferAsprintf(buf, "<model type='%s'",
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 33cef5b75c..af7fec6e22 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1374,6 +1374,16 @@ struct _virDomainWatchdogDef {
};
+/* the backend driver used for virtio interfaces */
+typedef enum {
+ VIR_DOMAIN_VIDEO_BACKEND_TYPE_DEFAULT,
+ VIR_DOMAIN_VIDEO_BACKEND_TYPE_QEMU,
+ VIR_DOMAIN_VIDEO_BACKEND_TYPE_VHOSTUSER,
+
+ VIR_DOMAIN_VIDEO_BACKEND_TYPE_LAST
+} virDomainVideoBackendType;
+
+
typedef enum {
VIR_DOMAIN_VIDEO_TYPE_DEFAULT,
VIR_DOMAIN_VIDEO_TYPE_VGA,
@@ -1424,6 +1434,7 @@ struct _virDomainVideoDef {
virDomainVideoDriverDefPtr driver;
virDomainDeviceInfo info;
virDomainVirtioOptionsPtr virtio;
+ virDomainVideoBackendType backend;
};
/* graphics console modes */
@@ -3409,6 +3420,7 @@ VIR_ENUM_DECL(virDomainWatchdogModel);
VIR_ENUM_DECL(virDomainWatchdogAction);
VIR_ENUM_DECL(virDomainPanicModel);
VIR_ENUM_DECL(virDomainVideo);
+VIR_ENUM_DECL(virDomainVideoBackend);
VIR_ENUM_DECL(virDomainHostdevMode);
VIR_ENUM_DECL(virDomainHostdevSubsys);
VIR_ENUM_DECL(virDomainHostdevCaps);
diff --git a/tests/qemuxml2argvdata/virtio-options.xml
b/tests/qemuxml2argvdata/virtio-options.xml
index 773038a320..bdfadca22d 100644
--- a/tests/qemuxml2argvdata/virtio-options.xml
+++ b/tests/qemuxml2argvdata/virtio-options.xml
@@ -73,7 +73,7 @@
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<video>
- <driver iommu='on' ats='on'/>
+ <driver iommu='on' ats='on' name='vhostuser'/>
<model type='virtio' heads='1' primary='yes'>
<acceleration accel3d='yes'/>
</model>
--
2.23.0