Hi

On Mon, Feb 14, 2022 at 5:15 PM Akihiko Odaki <akihiko.od...@gmail.com>
wrote:

> On Mon, Feb 14, 2022 at 9:07 PM Marc-André Lureau
> <marcandre.lur...@gmail.com> wrote:
> >
> > Hi Akihiko
> >
> > On Sun, Feb 13, 2022 at 6:44 AM Akihiko Odaki <akihiko.od...@gmail.com>
> wrote:
> >>
> >> ui/dbus required to have multiple DisplayChangeListeners (possibly with
> OpenGL)
> >> for a console but that caused several problems:
> >> - It broke egl-headless, an unusual display which implements OpenGL
> rendering
> >>   for non-OpenGL displays. The code to support multiple
> DisplayChangeListeners
> >>   does not consider the case where non-OpenGL displays listens OpenGL
> consoles.
> >
> >
> > Can you provide instructions on what broke? Even better write a test,
> please.
>
> The following command segfaults. Adding a test would be nice, but it
> would need a binary which uses OpenGL.
> qemu-system-x86_64 -device virtio-gpu-gl-pci -display egl-headless
> -vnc :0 -m 8G -cdrom Fedora-Workstation-Live-x86_64-34-1.2.iso -accel
> kvm
>

Thanks!

This is clearly a mistake from commit 7cc712e98 ("ui: dispatch GL events to
all listener").

It should have taken into account that some listeners do not have GL
callbacks, and guard the call.

We should wrap the missing ops->dpy_gl_call() with a if (ops->dpy_gl_call)
? I'll send a patch for that.

>
> > "make check-avocado AVOCADO_TESTS=tests/avocado/virtio-gpu.py", which
> covers egl-headless usage, works.
> >
> >>
> >> - Multiple OpenGL DisplayChangeListeners of dbus shares one
> DisplaySurface and
> >>   modifies its texture field, causing OpenGL texture leak and
> use-after-free.
> >
> >
> > Again, please provide instructions. I have regularly run -display dbus
> with multiple clients and qemu compiled with sanitizers. I don't see any
> leak or use after free.
>
> I doubt sanitizers can find this because it is an OpenGL texture. You
> may add a probe around surface_gl_create_texture and
> surface_gl_destroy_texture.
>

Indeed, a surface is created on each frame, because we create a 2d surface
on each qemu_console_resize(), which is called at each virgl scanout. This
is a regression introduced by commit ebced09185 ("console: save current
scanout details"). I can propose an easy fix, please check it.

And the root of the leak is actually surface_gl_create_texutre(), it should
be idempotent, just like destroy().


> >
> >>
> >> - Introduced extra code to check the compatibility of OpenGL context
> providers
> >>   and OpenGL texture renderers where those are often inherently tightly
> coupled
> >>   since they must share the same hardware.
> >
> >
> > So code checks are meant to prevent misusage. They might be too limited
> or broken in some ways, but reverting is likely going to introduce other
> regressions I was trying to fix.
>
> The misuse will not occur because DisplayChangeListeners will be
> merged with OpenGL context providers.
>

Ok, but aren't the checks enough to prevent it already? I have to check the
use cases and differences of design, but you might be right that we don't
need such a split after all.


> >
> >> - Needed extra work to broadcast the same change to multiple dbus
> listeners.
> >>
> >
> > Compared to what?
>
> Compared to sharing one DisplayChangeListener for multiple dbus listeners.
>

Well, you just moved the problem to the dbus display, not removed any work.

What we have currently is more generic, you should be able to add/remove
various listeners (in theory, we only really do it for dbus at this point).


>
> >
> >>
> >> This series solve them by implementing the change broadcast in ui/dbus,
> which
> >> knows exactly what is needed. Changes for the common code to support
> multiple
> >> OpenGL DisplayChangeListeners were reverted to fix egl-headless and
> reduce
> >> the code size.
> >
> >
> > Thanks a lot for your work, I am going to take a look at your approach.
> But please help us understand better what the problem actually is, by
> giving examples & tests to avoid future regressions and document the
> expected behaviour.
>
> The thing is really complicated and I may miss details so please feel
> free to ask questions or provide suggestions.
>
>
Reverting changes and proposing an alternative implementation requires
detailed explanation and convincing arguments. It may take a while, but we
will try to get through the problems and evaluate the alternative designs.
Thanks again for your help!

Regards,
> Akihiko Odaki
>
>
> >
> >>
> >> Akihiko Odaki (6):
> >>   ui/dbus: Share one listener for a console
> >>   Revert "console: save current scanout details"
> >>   Revert "ui: split the GL context in a different object"
> >>   Revert "ui: dispatch GL events to all listeners"
> >>   Revert "ui: associate GL context outside of display listener
> >>     registration"
> >>   Revert "ui: factor out qemu_console_set_display_gl_ctx()"
> >>
> >>  include/ui/console.h       |  60 +-----
> >>  include/ui/egl-context.h   |   6 +-
> >>  include/ui/gtk.h           |  11 +-
> >>  include/ui/sdl2.h          |   7 +-
> >>  include/ui/spice-display.h |   1 -
> >>  ui/console.c               | 258 +++++++----------------
> >>  ui/dbus-console.c          | 109 ++--------
> >>  ui/dbus-listener.c         | 417 +++++++++++++++++++++++++++----------
> >>  ui/dbus.c                  |  22 --
> >>  ui/dbus.h                  |  36 +++-
> >>  ui/egl-context.c           |   6 +-
> >>  ui/egl-headless.c          |  20 +-
> >>  ui/gtk-egl.c               |  10 +-
> >>  ui/gtk-gl-area.c           |   8 +-
> >>  ui/gtk.c                   |  25 +--
> >>  ui/sdl2-gl.c               |  10 +-
> >>  ui/sdl2.c                  |  14 +-
> >>  ui/spice-display.c         |  19 +-
> >>  18 files changed, 498 insertions(+), 541 deletions(-)
> >>
> >> --
> >> 2.32.0 (Apple Git-132)
> >>
> >>
> >
> >
> > --
> > Marc-André Lureau
>


-- 
Marc-André Lureau

Reply via email to