[libvirt] [PATCH v3 03/11] qemu: process: spice: Pick the first available DRM render node
Ján Tomko
jtomko at redhat.com
Fri Nov 30 14:10:40 UTC 2018
On Thu, Nov 29, 2018 at 03:20:13PM +0100, Erik Skultety wrote:
>Up until now, we formatted 'rendernode=' onto QEMU cmdline only if the
>user specified it in the XML, otherwise we let QEMU do it for us. This
>causes permission issues because by default the /dev/dri/renderDX
>permissions are as follows:
>
>crw-rw----. 1 root video
>
>There's literally no reason why it shouldn't be libvirt picking the DRM
>render node instead of QEMU, that way (and because we're using
>namespaces by default), we can safely relabel the device within the
>namespace.
>
>Signed-off-by: Erik Skultety <eskultet at redhat.com>
>---
> src/qemu/qemu_process.c | 22 +++++++++++++++-
> src/util/virutil.h | 2 +-
> .../graphics-spice-gl-no-rendernode.args | 25 +++++++++++++++++++
> .../graphics-spice-gl-no-rendernode.xml | 24 ++++++++++++++++++
> tests/qemuxml2argvmock.c | 9 +++++++
> 5 files changed, 80 insertions(+), 2 deletions(-)
> create mode 100644 tests/qemuxml2argvdata/graphics-spice-gl-no-rendernode.args
> create mode 100644 tests/qemuxml2argvdata/graphics-spice-gl-no-rendernode.xml
>
>diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
>index 12d1fca0d4..feebdc7fdc 100644
>--- a/src/qemu/qemu_process.c
>+++ b/src/qemu/qemu_process.c
>@@ -4784,9 +4784,25 @@ qemuProcessGraphicsSetupListen(virQEMUDriverPtr driver,
> }
>
>
>+static int
>+qemuProcessGraphicsSetupRenderNode(virDomainGraphicsDefPtr graphics,
>+ virQEMUCapsPtr qemuCaps)
>+{
>+ /* Don't bother picking a DRM node if QEMU doesn't support it. */
>+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_RENDERNODE))
>+ return 0;
>+
>+ if (!(graphics->data.spice.rendernode = virHostGetDRMRenderNode()))
>+ return -1;
>+
>+ return 0;
>+}
>+
>+
> static int
> qemuProcessSetupGraphics(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
>+ virQEMUCapsPtr qemuCaps,
> unsigned int flags)
> {
> virDomainGraphicsDefPtr graphics;
>@@ -4797,6 +4813,10 @@ qemuProcessSetupGraphics(virQEMUDriverPtr driver,
> for (i = 0; i < vm->def->ngraphics; i++) {
> graphics = vm->def->graphics[i];
>
>+ if (virDomainGraphicsNeedsRenderNode(graphics) &&
Just like the call below is called even for graphics with no listen,
you can call qemuProcessGraphicsSetupRenderNode unconditionally and move
the virDomainGraphicsNeedsRenderNode condition inside.
>+ qemuProcessGraphicsSetupRenderNode(graphics, qemuCaps) < 0)
>+ goto cleanup;
>+
> if (qemuProcessGraphicsSetupListen(driver, graphics, vm) < 0)
> goto cleanup;
> }
>@@ -5953,7 +5973,7 @@ qemuProcessPrepareDomain(virQEMUDriverPtr driver,
> goto cleanup;
>
> VIR_DEBUG("Setting graphics devices");
>- if (qemuProcessSetupGraphics(driver, vm, flags) < 0)
>+ if (qemuProcessSetupGraphics(driver, vm, priv->qemuCaps, flags) < 0)
> goto cleanup;
>
> VIR_DEBUG("Create domain masterKey");
>diff --git a/src/util/virutil.h b/src/util/virutil.h
>index 89bd21b148..588d779d10 100644
>--- a/src/util/virutil.h
>+++ b/src/util/virutil.h
>@@ -222,7 +222,7 @@ unsigned long long virMemoryMaxValue(bool ulong) ATTRIBUTE_NOINLINE;
>
> bool virHostHasIOMMU(void);
>
>-char *virHostGetDRMRenderNode(void);
>+char *virHostGetDRMRenderNode(void) ATTRIBUTE_NOINLINE;
>
> /**
> * VIR_ASSIGN_IS_OVERFLOW:
>diff --git a/tests/qemuxml2argvdata/graphics-spice-gl-no-rendernode.args b/tests/qemuxml2argvdata/graphics-spice-gl-no-rendernode.args
>new file mode 100644
>index 0000000000..1b08811692
>--- /dev/null
>+++ b/tests/qemuxml2argvdata/graphics-spice-gl-no-rendernode.args
A test called '-no-rendernode'...
[...]
>+-rtc base=utc \
>+-no-shutdown \
>+-no-acpi \
>+-usb \
>+-spice port=0,gl=on,rendernode=/dev/dri/foo \
... with a rendernode on the command line.
How about '-auto-rendernode'?
>+-vga cirrus \
>+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
The test cases are not used anywhere. Please use DO_TEST_CAPS_LATEST
when adding them.
Reviewed-by: Ján Tomko <jtomko at redhat.com>
Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20181130/c06ff7a6/attachment-0001.sig>
More information about the libvir-list
mailing list