From e5bda10141e677a749e4e6fb98b03c2378804a5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 15 Feb 2017 01:04:13 +0400 Subject: [PATCH] qemu: add rendernode argument MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a new attribute 'rendernode' to spice element. Give it to QEMU if qemu supports it (queued for 2.9). Signed-off-by: Marc-André Lureau Signed-off-by: Michal Privoznik --- docs/formatdomain.html.in | 7 +++++- docs/schemas/domaincommon.rng | 5 +++++ src/conf/domain_conf.c | 22 ++++++++++++++++--- src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 10 +++++++++ ...emuxml2argv-video-virtio-gpu-spice-gl.args | 2 +- ...qemuxml2argv-video-virtio-gpu-spice-gl.xml | 2 +- tests/qemuxml2argvtest.c | 1 + ...muxml2xmlout-video-virtio-gpu-spice-gl.xml | 2 +- 11 files changed, 48 insertions(+), 7 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 0a115f5dcd..b69bd4c44c 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>

Spice supports variable compression settings for audio, images and @@ -5665,6 +5665,11 @@ qemu-kvm -net nic,model=? /dev/null the gl element, by setting the enable property. (QEMU only, since 1.3.3).

+

+ 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, + since 3.1.0). +

rdp
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index d715bff29d..c5f101325e 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -3033,6 +3033,11 @@ + + + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 1bc72a4e90..a56ea82dda 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,11 +12142,13 @@ 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; if (!enable) { virReportError(VIR_ERR_XML_ERROR, "%s", _("spice gl element missing enable")); + VIR_FREE(rendernode); goto error; } @@ -12154,11 +12157,14 @@ virDomainGraphicsDefParseXMLSpice(virDomainGraphicsDefPtr def, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unknown enable value '%s'"), enable); VIR_FREE(enable); + VIR_FREE(rendernode); goto error; } 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 +22845,17 @@ virDomainGraphicsListenDefFormatAddr(virBufferPtr buf, virBufferAsprintf(buf, " listen='%s'", glisten->address); } +static void +virDomainSpiceGLDefFormat(virBufferPtr buf, virDomainGraphicsDefPtr def) +{ + if (def->data.spice.gl == VIR_TRISTATE_BOOL_ABSENT) + return; + + virBufferAsprintf(buf, "data.spice.gl)); + virBufferEscapeString(buf, " rendernode='%s'", def->data.spice.rendernode); + virBufferAddLit(buf, "/>\n"); +} static int virDomainGraphicsDefFormat(virBufferPtr buf, @@ -23082,9 +23099,8 @@ virDomainGraphicsDefFormat(virBufferPtr buf, if (def->data.spice.filetransfer) virBufferAsprintf(buf, "\n", virTristateBoolTypeToString(def->data.spice.filetransfer)); - if (def->data.spice.gl) - virBufferAsprintf(buf, "\n", - virTristateBoolTypeToString(def->data.spice.gl)); + + virDomainSpiceGLDefFormat(buf, def); } if (children) { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index dd79206f69..7e1afa4751 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1544,6 +1544,7 @@ struct _virDomainGraphicsDef { virTristateBool copypaste; virTristateBool filetransfer; virTristateBool gl; + char *rendernode; } spice; } data; /* nListens, listens, and *port are only useful if type is vnc, diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 399e314476..e851eec7a7 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -357,6 +357,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, "query-cpu-model-expansion", /* 245 */ "virtio-net.host_mtu", + "spice-rendernode", ); @@ -2950,6 +2951,7 @@ static struct virQEMUCapsCommandLineProps virQEMUCapsCommandLine[] = { { "spice", "unix", QEMU_CAPS_SPICE_UNIX }, { "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 }, }; static int diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 95bb67d448..0f998c473f 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -393,6 +393,7 @@ typedef enum { /* 245 */ QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION, /* qmp query-cpu-model-expansion */ QEMU_CAPS_VIRTIO_NET_HOST_MTU, /* virtio-net-*.host_mtu */ + QEMU_CAPS_SPICE_RENDERNODE, /* -spice rendernode */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c00a47a91a..f4bcfd467f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7920,6 +7920,16 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg, * TristateSwitch helper */ virBufferAsprintf(&opt, "gl=%s,", virTristateSwitchTypeToString(graphics->data.spice.gl)); + + if (graphics->data.spice.rendernode) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_RENDERNODE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("This QEMU doesn't support spice OpenGL rendernode")); + goto error; + } + + virBufferAsprintf(&opt, "rendernode=%s,", graphics->data.spice.rendernode); + } } if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SEAMLESS_MIGRATION)) { diff --git a/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args b/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args index f1ebb62e44..84439cddcd 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args @@ -19,6 +19,6 @@ QEMU_AUDIO_DRV=spice \ -drive file=/var/lib/libvirt/images/QEMUGuest1,format=qcow2,if=none,\ id=drive-ide0-0-0,cache=none \ -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \ --spice port=0,gl=on \ +-spice port=0,gl=on,rendernode=/dev/dri/foo \ -device virtio-gpu-pci,id=video0,virgl=on,bus=pci.0,addr=0x2 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.xml b/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.xml index b9c7c8af00..fd2580635c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.xml @@ -26,7 +26,7 @@ - +