qemu-kvm/SOURCES/kvm-ui-vnc-Update-display-update-interval-when-VM-state-.patch

98 lines
3.2 KiB
Diff

From e2931430d3f10dd521e6b4cc7505842fbc8296ec Mon Sep 17 00:00:00 2001
From: Juraj Marcin <jmarcin@redhat.com>
Date: Wed, 21 May 2025 17:16:13 +0200
Subject: [PATCH 01/31] ui/vnc: Update display update interval when VM state
changes to RUNNING
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
RH-Author: Juraj Marcin <None>
RH-MergeRequest: 463: ui/vnc: Update display update interval when VM state changes to RUNNING
RH-Jira: RHEL-100767
RH-Acked-by: Peter Xu <peterx@redhat.com>
RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
RH-Commit: [1/1] 60b1a7921296e82b616d055691fe8ac0f2e283b1
If a virtual machine is paused for an extended period time, for example,
due to an incoming migration, there are also no changes on the screen.
VNC in such case increases the display update interval by
VNC_REFRESH_INTERVAL_INC (50 ms). The update interval can then grow up
to VNC_REFRESH_INTERVAL_MAX (3000 ms).
When the machine resumes, it can then take up to 3 seconds for the first
display update. Furthermore, the update interval is then halved with
each display update with changes on the screen. If there are moving
elements on the screen, such as a video, this can be perceived as
freezing and stuttering for few seconds before the movement is smooth
again.
This patch resolves this issue, by adding a listener to VM state changes
and changing the update interval when the VM state changes to RUNNING.
The update_displaychangelistener() function updates the internal timer,
and the display is refreshed immediately if the timer is expired.
Signed-off-by: Juraj Marcin <jmarcin@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Link: https://lore.kernel.org/r/20250521151616.3951178-1-jmarcin@redhat.com
Signed-off-by: Peter Xu <peterx@redhat.com>
(cherry picked from commit 0310d594d98b39f9dde79b87fd8b0ad16e7c5459)
JIRA: https://issues.redhat.com/browse/RHEL-100767
Signed-off-by: Juraj Marcin <jmarcin@redhat.com>
---
ui/vnc.c | 12 ++++++++++++
ui/vnc.h | 2 ++
2 files changed, 14 insertions(+)
diff --git a/ui/vnc.c b/ui/vnc.c
index 5057ec8680..4afc925a18 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -3386,6 +3386,16 @@ static const DisplayChangeListenerOps dcl_ops = {
.dpy_cursor_define = vnc_dpy_cursor_define,
};
+static void vmstate_change_handler(void *opaque, bool running, RunState state)
+{
+ VncDisplay *vd = opaque;
+
+ if (state != RUN_STATE_RUNNING) {
+ return;
+ }
+ update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
+}
+
void vnc_display_init(const char *id, Error **errp)
{
VncDisplay *vd;
@@ -3422,6 +3432,8 @@ void vnc_display_init(const char *id, Error **errp)
vd->dcl.ops = &dcl_ops;
register_displaychangelistener(&vd->dcl);
vd->kbd = qkbd_state_init(vd->dcl.con);
+ vd->vmstate_handler_entry = qemu_add_vm_change_state_handler(
+ &vmstate_change_handler, vd);
}
diff --git a/ui/vnc.h b/ui/vnc.h
index e5fa2efa3e..e9da707dbc 100644
--- a/ui/vnc.h
+++ b/ui/vnc.h
@@ -186,6 +186,8 @@ struct VncDisplay
#endif
AudioState *audio_state;
+
+ VMChangeStateEntry *vmstate_handler_entry;
};
typedef struct VncTight {
--
2.39.3