| From ffdf44cb8b4c743e7ab0ce46d62687d7178f9a49 Mon Sep 17 00:00:00 2001 |
| From: Jon Maloy <jmaloy@redhat.com> |
| Date: Fri, 18 Nov 2022 20:26:54 -0500 |
| Subject: [PATCH 3/3] ui/vnc.c: Fixed a deadlock bug. |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| RH-Author: Jon Maloy <jmaloy@redhat.com> |
| RH-MergeRequest: 234: ui/vnc.c: Fixed a deadlock bug. |
| RH-Bugzilla: 2141896 |
| RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com> |
| RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com> |
| RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com> |
| RH-Commit: [1/1] d3d1d28d7b621a8ae8a593a5bd5303fa7951c17c (jmaloy/qemu-kvm) |
| |
| BZ: https://bugzilla.redhat.com/show_bug.cgi?id=2141896 |
| Upstream: Merged |
| |
| commit 1dbbe6f172810026c51dc84ed927a3cc23017949 |
| Author: Rao Lei <lei.rao@intel.com> |
| Date: Wed Jan 5 10:08:08 2022 +0800 |
| |
| ui/vnc.c: Fixed a deadlock bug. |
| |
| The GDB statck is as follows: |
| (gdb) bt |
| 0 __lll_lock_wait (futex=futex@entry=0x56211df20360, private=0) at lowlevellock.c:52 |
| 1 0x00007f263caf20a3 in __GI___pthread_mutex_lock (mutex=0x56211df20360) at ../nptl/pthread_mutex_lock.c:80 |
| 2 0x000056211a757364 in qemu_mutex_lock_impl (mutex=0x56211df20360, file=0x56211a804857 "../ui/vnc-jobs.h", line=60) |
| at ../util/qemu-thread-posix.c:80 |
| 3 0x000056211a0ef8c7 in vnc_lock_output (vs=0x56211df14200) at ../ui/vnc-jobs.h:60 |
| 4 0x000056211a0efcb7 in vnc_clipboard_send (vs=0x56211df14200, count=1, dwords=0x7ffdf1701338) at ../ui/vnc-clipboard.c:138 |
| 5 0x000056211a0f0129 in vnc_clipboard_notify (notifier=0x56211df244c8, data=0x56211dd1bbf0) at ../ui/vnc-clipboard.c:209 |
| 6 0x000056211a75dde8 in notifier_list_notify (list=0x56211afa17d0 <clipboard_notifiers>, data=0x56211dd1bbf0) at ../util/notify.c:39 |
| 7 0x000056211a0bf0e6 in qemu_clipboard_update (info=0x56211dd1bbf0) at ../ui/clipboard.c:50 |
| 8 0x000056211a0bf05d in qemu_clipboard_peer_release (peer=0x56211df244c0, selection=QEMU_CLIPBOARD_SELECTION_CLIPBOARD) |
| at ../ui/clipboard.c:41 |
| 9 0x000056211a0bef9b in qemu_clipboard_peer_unregister (peer=0x56211df244c0) at ../ui/clipboard.c:19 |
| 10 0x000056211a0d45f3 in vnc_disconnect_finish (vs=0x56211df14200) at ../ui/vnc.c:1358 |
| 11 0x000056211a0d4c9d in vnc_client_read (vs=0x56211df14200) at ../ui/vnc.c:1611 |
| 12 0x000056211a0d4df8 in vnc_client_io (ioc=0x56211ce70690, condition=G_IO_IN, opaque=0x56211df14200) at ../ui/vnc.c:1649 |
| 13 0x000056211a5b976c in qio_channel_fd_source_dispatch |
| (source=0x56211ce50a00, callback=0x56211a0d4d71 <vnc_client_io>, user_data=0x56211df14200) at ../io/channel-watch.c:84 |
| 14 0x00007f263ccede8e in g_main_context_dispatch () at /lib/x86_64-linux-gnu/libglib-2.0.so.0 |
| 15 0x000056211a77d4a1 in glib_pollfds_poll () at ../util/main-loop.c:232 |
| 16 0x000056211a77d51f in os_host_main_loop_wait (timeout=958545) at ../util/main-loop.c:255 |
| 17 0x000056211a77d630 in main_loop_wait (nonblocking=0) at ../util/main-loop.c:531 |
| 18 0x000056211a45bc8e in qemu_main_loop () at ../softmmu/runstate.c:726 |
| 19 0x000056211a0b45fa in main (argc=69, argv=0x7ffdf1701778, envp=0x7ffdf17019a8) at ../softmmu/main.c:50 |
| |
| From the call trace, we can see it is a deadlock bug. |
| vnc_disconnect_finish will acquire the output_mutex. |
| But, the output_mutex will be acquired again in vnc_clipboard_send. |
| Repeated locking will cause deadlock. So, I move |
| qemu_clipboard_peer_unregister() behind vnc_unlock_output(); |
| Fixes: 0bf41cab93e ("ui/vnc: clipboard support") |
| Signed-off-by: Lei Rao <lei.rao@intel.com> |
| Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> |
| Message-Id: <20220105020808.597325-1-lei.rao@intel.com> |
| Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> |
| |
| (cherry picked from commit 1dbbe6f172810026c51dc84ed927a3cc23017949) |
| Signed-off-by: Jon Maloy <jmaloy@redhat.com> |
| |
| ui/vnc.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/ui/vnc.c b/ui/vnc.c |
| index a14b6861be..76372ca1de 100644 |
| |
| |
| @@ -1354,12 +1354,12 @@ void vnc_disconnect_finish(VncState *vs) |
| /* last client gone */ |
| vnc_update_server_surface(vs->vd); |
| } |
| + vnc_unlock_output(vs); |
| + |
| if (vs->cbpeer.update.notify) { |
| qemu_clipboard_peer_unregister(&vs->cbpeer); |
| } |
| |
| - vnc_unlock_output(vs); |
| - |
| qemu_mutex_destroy(&vs->output_mutex); |
| if (vs->bh != NULL) { |
| qemu_bh_delete(vs->bh); |
| -- |
| 2.37.3 |
| |