[libvirt] [PATCH 5/5] qemu: add rendernode argument
Michal Privoznik
mprivozn at redhat.com
Fri Feb 17 14:54:44 UTC 2017
On 02/14/2017 10:04 PM, marcandre.lureau at redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau at 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 at 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
More information about the libvir-list
mailing list