On 02/14/2017 10:04 PM, marcandre.lureau(a)redhat.com wrote:
From: Marc-André Lureau <marcandre.lureau(a)redhat.com>
Add a new attribute 'rendernode' to <gl> spice element.
Give it to QEMU if qemu supports it (queued for 2.9).
Signed-off-by: Marc-André Lureau <marcandre.lureau(a)redhat.com>
---
docs/formatdomain.html.in | 7 +++++-
docs/schemas/domaincommon.rng | 5 ++++
src/conf/domain_conf.c | 28 +++++++++++++++++++---
src/conf/domain_conf.h | 1 +
src/qemu/qemu_capabilities.c | 2 ++
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_command.c | 10 ++++++++
.../qemuxml2argv-video-virtio-gpu-spice-gl.args | 2 +-
.../qemuxml2argv-video-virtio-gpu-spice-gl.xml | 2 +-
tests/qemuxml2argvtest.c | 1 +
.../qemuxml2xmlout-video-virtio-gpu-spice-gl.xml | 2 +-
11 files changed, 54 insertions(+), 7 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 0a115f5dc..67f486747 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -5619,7 +5619,7 @@ qemu-kvm -net nic,model=? /dev/null
<clipboard copypaste='no'/>
<mouse mode='client'/>
<filetransfer enable='no'/>
- <gl enable='yes'/>
+ <gl enable='yes'
rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/>
</graphics></pre>
<p>
Spice supports variable compression settings for audio, images and
@@ -5665,6 +5665,11 @@ qemu-kvm -net nic,model=? /dev/null
the <code>gl</code> element, by setting the
<code>enable</code>
property. (QEMU only, <span class="since">since
1.3.3</span>).
</p>
+ <p>
+ By default, QEMU will pick the first available GPU DRM render node.
+ You may specify a DRM render node path to use instead. (QEMU only,
+ <span class="since">since 3.1</span>).
+ </p>
</dd>
<dt><code>rdp</code></dt>
<dd>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index d715bff29..c5f101325 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3033,6 +3033,11 @@
<attribute name="enable">
<ref name="virYesNo"/>
</attribute>
+ <optional>
+ <attribute name="rendernode">
+ <ref name="absFilePath"/>
+ </attribute>
+ </optional>
<empty/>
</element>
</optional>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 1bc72a4e9..b577d0aba 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1300,6 +1300,7 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def)
break;
case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
+ VIR_FREE(def->data.spice.rendernode);
VIR_FREE(def->data.spice.keymap);
virDomainGraphicsAuthDefClear(&def->data.spice.auth);
break;
@@ -12141,6 +12142,7 @@ virDomainGraphicsDefParseXMLSpice(virDomainGraphicsDefPtr def,
def->data.spice.filetransfer = enableVal;
} else if (xmlStrEqual(cur->name, BAD_CAST "gl")) {
char *enable = virXMLPropString(cur, "enable");
+ char *rendernode = virXMLPropString(cur, "rendernode");
int enableVal;
This might be leaked if control reaches 'goto' lines in between this and
the following hunk.
if (!enable) {
@@ -12159,6 +12161,8 @@ virDomainGraphicsDefParseXMLSpice(virDomainGraphicsDefPtr def,
VIR_FREE(enable);
def->data.spice.gl = enableVal;
+ def->data.spice.rendernode = rendernode;
+
} else if (xmlStrEqual(cur->name, BAD_CAST "mouse")) {
char *mode = virXMLPropString(cur, "mode");
int modeVal;
@@ -22839,6 +22843,23 @@
virDomainGraphicsListenDefFormatAddr(virBufferPtr buf,
virBufferAsprintf(buf, " listen='%s'", glisten->address);
}
+static int
+virDomainSpiceGLDefFormat(virBufferPtr buf, virDomainGraphicsDefPtr def)
+{
+ if (def->data.spice.gl == VIR_TRISTATE_BOOL_ABSENT) {
+ return 0;
+ }
Firstly, no need for this function to return an int. We usually have
functions like this return nothing (void). Secondly, there's no need to
put curly braces around one line body.
+
+ virBufferAsprintf(buf, "<gl enable='%s'",
+ virTristateBoolTypeToString(def->data.spice.gl));
+
+ if (def->data.spice.rendernode)
+ virBufferEscapeString(buf, " rendernode='%s'",
def->data.spice.rendernode);
The virBufferEscapeString() is no-op if the last arg is NULL.
+
+ virBufferAddLit(buf, "/>\n");
+
+ return 0;
+}
static int
virDomainGraphicsDefFormat(virBufferPtr buf,
@@ -23082,9 +23103,10 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
if (def->data.spice.filetransfer)
virBufferAsprintf(buf, "<filetransfer
enable='%s'/>\n",
virTristateBoolTypeToString(def->data.spice.filetransfer));
- if (def->data.spice.gl)
- virBufferAsprintf(buf, "<gl enable='%s'/>\n",
- virTristateBoolTypeToString(def->data.spice.gl));
+
+ if (virDomainSpiceGLDefFormat(buf, def) < 0) {
+ return -1;
+ }
Again. This will never happen and also there's no need for {}.
}
if (children) {
I am fixing all of these small nits that I've raised and pushing all of
the patches. I have couple of follow up patches ready so expect them to
be send shortly.
Michal