aboutsummaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2019-03-05 14:09:30 +0100
committerGerd Hoffmann <kraxel@redhat.com>2019-03-11 08:39:02 +0100
commitbbcdeb623d28cb327591e93aec6c10d2143ae929 (patch)
tree83ac87519fba20eb4ee94af8bee9acdc4c5d48a1 /ui
parent459a707eccc74b729beafceaef882c9ed1bcbc97 (diff)
downloadqemu-bbcdeb623d28cb327591e93aec6c10d2143ae929.zip
qemu-bbcdeb623d28cb327591e93aec6c10d2143ae929.tar.gz
qemu-bbcdeb623d28cb327591e93aec6c10d2143ae929.tar.bz2
vnc: fix update stalls
vnc aborts display update jobs on video mode switches and page flips. That can cause vnc update stalls in case an unfinished vnc job gets aborted. The vnc client will never receive the requested update then. Fix that by copying the state from job_update back to update in that case. Reports complain about stalls with two or more clients being connected at the same time, on some but not all connections. I suspect it can also happen with a single connection, multiple connections only make this more much likely to happen. Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1662260 Reported-by: Ying Fang <fangying1@huawei.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Ying Fang <fangying1@huawei.com> Message-id: 20190305130930.24516-1-kraxel@redhat.com
Diffstat (limited to 'ui')
-rw-r--r--ui/vnc.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/ui/vnc.c b/ui/vnc.c
index da4a21d..2f2ab62 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -700,6 +700,12 @@ static void vnc_abort_display_jobs(VncDisplay *vd)
}
QTAILQ_FOREACH(vs, &vd->clients, next) {
vnc_lock_output(vs);
+ if (vs->update == VNC_STATE_UPDATE_NONE &&
+ vs->job_update != VNC_STATE_UPDATE_NONE) {
+ /* job aborted before completion */
+ vs->update = vs->job_update;
+ vs->job_update = VNC_STATE_UPDATE_NONE;
+ }
vs->abort = false;
vnc_unlock_output(vs);
}