[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 08/12] spice-display: fix qemu_spice_cursor_refresh_b
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PULL 08/12] spice-display: fix qemu_spice_cursor_refresh_bh locking |
Date: |
Thu, 23 Aug 2018 11:56:49 +0200 |
From: Paolo Bonzini <address@hidden>
spice-display should not call the ui/console.c functions dpy_cursor_define
and dpy_moues_set with the SimpleSpiceDisplay lock taken. That will cause
a deadlock, because the DisplayChangeListener callbacks will take the lock
again. It is also in general a bad idea to invoke generic callbacks with a
lock taken, because it can cause AB-BA deadlocks in the long run. The only
thing that requires care is that the cursor may disappear as soon as the
mutex is released, so you need an extra cursor_get/cursor_put pair.
Signed-off-by: Paolo Bonzini <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
Message-id: address@hidden
[ kraxel: fix dpy_cursor_define() call ]
Signed-off-by: Gerd Hoffmann <address@hidden>
---
ui/spice-display.c | 30 ++++++++++++++++++------------
1 file changed, 18 insertions(+), 12 deletions(-)
diff --git a/ui/spice-display.c b/ui/spice-display.c
index 46df673cd7..7b230987dc 100644
--- a/ui/spice-display.c
+++ b/ui/spice-display.c
@@ -450,29 +450,35 @@ void qemu_spice_display_switch(SimpleSpiceDisplay *ssd,
qemu_mutex_unlock(&ssd->lock);
}
-static void qemu_spice_cursor_refresh_unlocked(SimpleSpiceDisplay *ssd)
+void qemu_spice_cursor_refresh_bh(void *opaque)
{
+ SimpleSpiceDisplay *ssd = opaque;
+
+ qemu_mutex_lock(&ssd->lock);
if (ssd->cursor) {
+ QEMUCursor *c = ssd->cursor;
assert(ssd->dcl.con);
- dpy_cursor_define(ssd->dcl.con, ssd->cursor);
+ cursor_get(c);
+ qemu_mutex_unlock(&ssd->lock);
+ dpy_cursor_define(ssd->dcl.con, c);
+ qemu_mutex_lock(&ssd->lock);
+ cursor_put(c);
}
+
if (ssd->mouse_x != -1 && ssd->mouse_y != -1) {
+ int x, y;
assert(ssd->dcl.con);
- dpy_mouse_set(ssd->dcl.con, ssd->mouse_x, ssd->mouse_y, 1);
+ x = ssd->mouse_x;
+ y = ssd->mouse_y;
ssd->mouse_x = -1;
ssd->mouse_y = -1;
+ qemu_mutex_unlock(&ssd->lock);
+ dpy_mouse_set(ssd->dcl.con, x, y, 1);
+ } else {
+ qemu_mutex_unlock(&ssd->lock);
}
}
-void qemu_spice_cursor_refresh_bh(void *opaque)
-{
- SimpleSpiceDisplay *ssd = opaque;
-
- qemu_mutex_lock(&ssd->lock);
- qemu_spice_cursor_refresh_unlocked(ssd);
- qemu_mutex_unlock(&ssd->lock);
-}
-
void qemu_spice_display_refresh(SimpleSpiceDisplay *ssd)
{
graphic_hw_update(ssd->dcl.con);
--
2.9.3
- [Qemu-devel] [PULL 00/12] Ui 20180823 v3 patches, Gerd Hoffmann, 2018/08/23
- [Qemu-devel] [PULL 01/12] ui/sdl2: Remove the obsolete SDL_INIT_NOPARACHUTE flag, Gerd Hoffmann, 2018/08/23
- [Qemu-devel] [PULL 04/12] sdl2: redraw correctly when scanout_mode enabled., Gerd Hoffmann, 2018/08/23
- [Qemu-devel] [PULL 03/12] ui: use enum to string helpers, Gerd Hoffmann, 2018/08/23
- [Qemu-devel] [PULL 02/12] vnc: fix memleak of the "vnc-worker-output" name, Gerd Hoffmann, 2018/08/23
- [Qemu-devel] [PULL 09/12] ui/sdl2: Fix broken -full-screen CLI option, Gerd Hoffmann, 2018/08/23
- [Qemu-devel] [PULL 06/12] vnc: remove support for deprecated tls, x509, x509verify options, Gerd Hoffmann, 2018/08/23
- [Qemu-devel] [PULL 11/12] dmabuf: add y0_top, pass it to spice, Gerd Hoffmann, 2018/08/23
- [Qemu-devel] [PULL 07/12] spice-display: access ptr_x/ptr_y under Mutex, Gerd Hoffmann, 2018/08/23
- [Qemu-devel] [PULL 05/12] doc: switch to modern syntax for VNC TLS setup, Gerd Hoffmann, 2018/08/23
- [Qemu-devel] [PULL 08/12] spice-display: fix qemu_spice_cursor_refresh_bh locking,
Gerd Hoffmann <=
- [Qemu-devel] [PULL 10/12] ui/vnc: Remove useless parenthesis around DIV_ROUND_UP macro, Gerd Hoffmann, 2018/08/23
- [Qemu-devel] [PULL 12/12] util: promote qemu_egl_rendernode_open() to libqemuutil, Gerd Hoffmann, 2018/08/23
- Re: [Qemu-devel] [PULL 00/12] Ui 20180823 v3 patches, Peter Maydell, 2018/08/24