[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 2/6] ui: avoid unnecessary memory operations in vnc_refresh_server
From: |
Gerd Hoffmann |
Subject: |
[PULL 2/6] ui: avoid unnecessary memory operations in vnc_refresh_server_surface() |
Date: |
Fri, 18 Mar 2022 14:56:30 +0100 |
From: "Wen, Jianxian" <Jianxian.Wen@verisilicon.com>
Check the dirty bits in advance to avoid unnecessary memory operations.
In the case that guest surface has different format than the server,
but it does not have dirty bits which means no refresh is actually needed,
the memory operations is not necessary.
Signed-off-by: Jianxian Wen <jianxian.wen@verisilicon.com>
Signed-off-by: Lu Gao <lu.gao@verisilicon.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <4C23C17B8E87E74E906A25A3254A03F4FA22100C@SHASXM06.verisilicon.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
ui/vnc.c | 26 +++++++++++++++++---------
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/ui/vnc.c b/ui/vnc.c
index 3ccd33dedcc8..310a873c2184 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -3098,6 +3098,9 @@ static int vnc_refresh_server_surface(VncDisplay *vd)
VncState *vs;
int has_dirty = 0;
pixman_image_t *tmpbuf = NULL;
+ unsigned long offset;
+ int x;
+ uint8_t *guest_ptr, *server_ptr;
struct timeval tv = { 0, 0 };
@@ -3106,6 +3109,13 @@ static int vnc_refresh_server_surface(VncDisplay *vd)
has_dirty = vnc_update_stats(vd, &tv);
}
+ offset = find_next_bit((unsigned long *) &vd->guest.dirty,
+ height * VNC_DIRTY_BPL(&vd->guest), 0);
+ if (offset == height * VNC_DIRTY_BPL(&vd->guest)) {
+ /* no dirty bits in guest surface */
+ return has_dirty;
+ }
+
/*
* Walk through the guest dirty map.
* Check and copy modified bits from guest to server surface.
@@ -3130,15 +3140,6 @@ static int vnc_refresh_server_surface(VncDisplay *vd)
line_bytes = MIN(server_stride, guest_ll);
for (;;) {
- int x;
- uint8_t *guest_ptr, *server_ptr;
- unsigned long offset = find_next_bit((unsigned long *)
&vd->guest.dirty,
- height *
VNC_DIRTY_BPL(&vd->guest),
- y * VNC_DIRTY_BPL(&vd->guest));
- if (offset == height * VNC_DIRTY_BPL(&vd->guest)) {
- /* no more dirty bits */
- break;
- }
y = offset / VNC_DIRTY_BPL(&vd->guest);
x = offset % VNC_DIRTY_BPL(&vd->guest);
@@ -3177,6 +3178,13 @@ static int vnc_refresh_server_surface(VncDisplay *vd)
}
y++;
+ offset = find_next_bit((unsigned long *) &vd->guest.dirty,
+ height * VNC_DIRTY_BPL(&vd->guest),
+ y * VNC_DIRTY_BPL(&vd->guest));
+ if (offset == height * VNC_DIRTY_BPL(&vd->guest)) {
+ /* no more dirty bits */
+ break;
+ }
}
qemu_pixman_image_unref(tmpbuf);
return has_dirty;
--
2.35.1
- [PULL 0/6] Fixes 20220318 patches, Gerd Hoffmann, 2022/03/18
- [PULL 1/6] ui/gtk: Ignore 2- and 3-button press events, Gerd Hoffmann, 2022/03/18
- [PULL 2/6] ui: avoid unnecessary memory operations in vnc_refresh_server_surface(),
Gerd Hoffmann <=
- [PULL 4/6] hw/display/cirrus_vga: Clean up indentation in pci_cirrus_vga_realize(), Gerd Hoffmann, 2022/03/18
- [PULL 6/6] hw/display/vga: Report a proper error when adding a 2nd ISA VGA, Gerd Hoffmann, 2022/03/18
- [PULL 3/6] audio/mixeng: Do not declare unused variables, Gerd Hoffmann, 2022/03/18
- [PULL 5/6] hw/display: Allow vga_common_init() to return errors, Gerd Hoffmann, 2022/03/18
- Re: [PULL 0/6] Fixes 20220318 patches, Peter Maydell, 2022/03/19