[libvirt] [PATCH v1 06/11] conf: Make graphics's GL a standalone structure
John Ferlan
jferlan at redhat.com
Thu Jun 28 20:46:23 UTC 2018
On 06/27/2018 09:34 AM, Erik Skultety wrote:
> Since we support gl with SPICE and SDL with future VNC enablement in
> sight (egl-headless), let's separate the gl-related attributes into a
> standalone structure.
>
> Signed-off-by: Erik Skultety <eskultet at redhat.com>
> ---
> src/conf/domain_conf.c | 137 +++++++++++++++++++++++++-------------------
> src/conf/domain_conf.h | 12 +++-
> src/qemu/qemu_cgroup.c | 10 ++--
> src/qemu/qemu_command.c | 66 ++++++++++++---------
> src/qemu/qemu_domain.c | 7 ++-
> src/security/security_dac.c | 7 ++-
> 6 files changed, 138 insertions(+), 101 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 09d9bac739..6bfa3ca130 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1420,8 +1420,6 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def)
> break;
>
> case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
> - VIR_FREE(def->data.spice.rendernode);
> - VIR_FREE(def->data.spice.keymap);
Perhaps a bit too aggressive here? Restore the keymap FREE - it's
allocated in virDomainGraphicsDefParseXMLSpice
> virDomainGraphicsAuthDefClear(&def->data.spice.auth);
> break;
>
> @@ -1429,6 +1427,8 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def)
> break;
> }
>
> + virDomainGraphicsGLDefFree(def->gl);
> +
> for (i = 0; i < def->nListens; i++)
> virDomainGraphicsListenDefClear(&def->listens[i]);
> VIR_FREE(def->listens);
> @@ -1436,6 +1436,18 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def)
> VIR_FREE(def);
> }
>
> +
> +void
> +virDomainGraphicsGLDefFree(virDomainGraphicsGLDefPtr def)
The only caller is above - even after the last patch, thus this should
be static to this function and above the previous.
> +{
> + if (!def)
> + return;
> +
> + VIR_FREE(def->rendernode);
> + VIR_FREE(def);
> +}
> +
> +
> const char *virDomainInputDefGetPath(virDomainInputDefPtr input)
> {
> switch ((virDomainInputType) input->type) {
> @@ -13555,6 +13567,48 @@ virDomainGraphicsListensParseXML(virDomainGraphicsDefPtr def,
> }
>
>
> +static int
> +virDomainGraphicsGLDefParseXML(virDomainGraphicsDefPtr def,
> + xmlNodePtr node)
> +{
> + virDomainGraphicsGLDefPtr gl = NULL;
> + char *enable = NULL;
> + int ret = -1;
> +
> + if (!node)
> + return 0;
> +
> + if (VIR_ALLOC(gl) < 0)
> + return -1;
> +
> + if (!(enable = virXMLPropString(node, "enable"))) {
> + virReportError(VIR_ERR_XML_ERROR, "%s",
> + _("'enable' attribute is mandatory for graphics "
> + "<gl> element"));
> + goto cleanup;
> + }
> +
> + if ((gl->enable =
> + virTristateBoolTypeFromString(enable)) <= 0) {
This should go on the previous line - it fits, I checked.
The <= changes from the previous code which had:
- enableVal = virTristateBoolTypeFromString(enable);
- if (enableVal < 0) {
hopefully there's no "default"'s in the wild. But it is fine given the
previous usage model of absent being the default and being checked.
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("unknown value for attribute enable '%s'"),
> + enable);
> + goto cleanup;
> + }
> +
> + if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE)
> + gl->rendernode = virXMLPropString(node, "rendernode");
> +
> + VIR_STEAL_PTR(def->gl, gl);
> +
> + ret = 0;
> + cleanup:
> + VIR_FREE(enable);
> + virDomainGraphicsGLDefFree(gl);
> + return ret;
> +}
> +
> +
> static int
> virDomainGraphicsDefParseXMLVNC(virDomainGraphicsDefPtr def,
> xmlNodePtr node,
> @@ -13644,8 +13698,6 @@ virDomainGraphicsDefParseXMLSDL(virDomainGraphicsDefPtr def,
> {
> xmlNodePtr save = ctxt->node;
> char *enable = NULL;
> - int enableVal;
> - xmlNodePtr glNode;
> char *fullscreen = virXMLPropString(node, "fullscreen");
> int ret = -1;
>
> @@ -13668,23 +13720,9 @@ virDomainGraphicsDefParseXMLSDL(virDomainGraphicsDefPtr def,
> def->data.sdl.xauth = virXMLPropString(node, "xauth");
> def->data.sdl.display = virXMLPropString(node, "display");
>
> - glNode = virXPathNode("./gl", ctxt);
> - if (glNode) {
> - enable = virXMLPropString(glNode, "enable");
> - if (!enable) {
> - virReportError(VIR_ERR_XML_ERROR, "%s",
> - _("sdl gl element missing enable"));
> - goto cleanup;
> - }
> -
> - enableVal = virTristateBoolTypeFromString(enable);
> - if (enableVal < 0) {
> - virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> - _("unknown enable value '%s'"), enable);
> - goto cleanup;
> - }
> - def->data.sdl.gl = enableVal;
> - }
> + if (virDomainGraphicsGLDefParseXML(def,
> + virXPathNode("./gl[1]", ctxt)) < 0)
Move to the previous line, it fits, I checked.
> + goto cleanup;
>
> ret = 0;
> cleanup:
> @@ -14026,31 +14064,6 @@ virDomainGraphicsDefParseXMLSpice(virDomainGraphicsDefPtr def,
> VIR_FREE(enable);
>
> def->data.spice.filetransfer = enableVal;
> - } else if (virXMLNodeNameEqual(cur, "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;
> - }
> -
> - if ((enableVal =
> - virTristateBoolTypeFromString(enable)) <= 0) {
> - 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;
> -
Was moving to the last else if intentional? IDC either way, but it is
strange.
> } else if (virXMLNodeNameEqual(cur, "mouse")) {
> char *mode = virXMLPropString(cur, "mode");
> int modeVal;
> @@ -14071,6 +14084,9 @@ virDomainGraphicsDefParseXMLSpice(virDomainGraphicsDefPtr def,
[...]
> static int
> virDomainGraphicsDefFormat(virBufferPtr buf,
> virDomainGraphicsDefPtr def,
> @@ -26247,18 +26270,12 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
> if (def->data.sdl.fullscreen)
> virBufferAddLit(buf, " fullscreen='yes'");
>
> - if (!children && def->data.sdl.gl != VIR_TRISTATE_BOOL_ABSENT) {
> + if (!children && def->gl) {
> virBufferAddLit(buf, ">\n");
> virBufferAdjustIndent(buf, 2);
> children = true;
> }
>
> - if (def->data.sdl.gl != VIR_TRISTATE_BOOL_ABSENT) {
> - virBufferAsprintf(buf, "<gl enable='%s'",
> - virTristateBoolTypeToString(def->data.sdl.gl));
> - virBufferAddLit(buf, "/>\n");
> - }
> -
> break;
>
> case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
> @@ -26405,8 +26422,7 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
> if (!children && (def->data.spice.image || def->data.spice.jpeg ||
> def->data.spice.zlib || def->data.spice.playback ||
> def->data.spice.streaming || def->data.spice.copypaste ||
> - def->data.spice.mousemode || def->data.spice.filetransfer ||
> - def->data.spice.gl)) {
> + def->data.spice.mousemode || def->data.spice.filetransfer)) {
Interesting, it's a bit sneaky but even when not provided the above
format for <listen type...> will format to 'none' meaning we don't have
to worry about def->gl here (even if autoport isn't provided for
<graphics...>
Hopefully that remains "true" going forward in time.
> virBufferAddLit(buf, ">\n");
> virBufferAdjustIndent(buf, 2);
> children = true;
> @@ -26436,9 +26452,10 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
> virBufferAsprintf(buf, "<filetransfer enable='%s'/>\n",
> virTristateBoolTypeToString(def->data.spice.filetransfer));
>
> - virDomainSpiceGLDefFormat(buf, def);
> }
>
> + virDomainGraphicsGLDefFormat(buf, def);
> +
> if (children) {
> virBufferAdjustIndent(buf, -2);
> virBufferAddLit(buf, "</graphics>\n");
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 0924fc4f3c..20dc1334c4 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
[...]
>
> typedef enum {
> @@ -2837,6 +2842,7 @@ int virDomainObjWaitUntil(virDomainObjPtr vm,
> void virDomainPanicDefFree(virDomainPanicDefPtr panic);
> void virDomainResourceDefFree(virDomainResourceDefPtr resource);
> void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def);
> +void virDomainGraphicsGLDefFree(virDomainGraphicsGLDefPtr def);
This won't be necessary.... The "tip off" is that the private syms file
wasn't touched...
> const char *virDomainInputDefGetPath(virDomainInputDefPtr input);
> void virDomainInputDefFree(virDomainInputDefPtr def);
> virDomainDiskDefPtr virDomainDiskDefNew(virDomainXMLOptionPtr xmlopt);
[...]
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 195d03e373..ef0be95b0f 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -7740,7 +7740,8 @@ qemuBuildGraphicsSDLCommandLine(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED,
> virCommandAddArg(cmd, "-display");
> virBufferAddLit(&opt, "sdl");
>
> - if (graphics->data.sdl.gl != VIR_TRISTATE_BOOL_ABSENT) {
> + if (graphics->gl &&
> + graphics->gl->enable != VIR_TRISTATE_BOOL_ABSENT) {
Ironically, because the <= exists in the Parse code, that means that if
->gl is true, then we don't have to check ABSENT I would think.
I also see other/future patches seem to use enable == YES a lot...
> if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SDL_GL)) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> _("OpenGL for SDL is not supported with this QEMU "
[...]
> @@ -8122,10 +8127,17 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
> virBufferAddLit(&opt, "seamless-migration=on,");
> }
>
> + /* OpenGL magic */
> + if (graphics->gl &&
> + graphics->gl->enable == VIR_TRISTATE_BOOL_YES &&
> + qemuBuildGraphicsSPICEGLCommandLine(graphics->gl, &opt, qemuCaps) < 0)
> + goto error;
> +
Not that it matters, but this is a change of order w/
"seamless-migration=on,"... No code uses both now and I don't imagine
order matters.
With recommended adjustments,
Reviewed-by: John Ferlan <jferlan at redhat.com>
John
> virBufferTrim(&opt, ",", -1);
>
> virCommandAddArg(cmd, "-spice");
> virCommandAddArgBuffer(cmd, &opt);
> +
> if (graphics->data.spice.keymap)
> virCommandAddArgList(cmd, "-k",
> graphics->data.spice.keymap, NULL);
[...]
More information about the libvir-list
mailing list