From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Lkcwt-00028h-8j for qemu-devel@nongnu.org; Fri, 20 Mar 2009 07:31:39 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Lkcwo-00026k-Eh for qemu-devel@nongnu.org; Fri, 20 Mar 2009 07:31:38 -0400 Received: from [199.232.76.173] (port=44560 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Lkcwo-00026e-3f for qemu-devel@nongnu.org; Fri, 20 Mar 2009 07:31:34 -0400 Received: from mx2.redhat.com ([66.187.237.31]:50218) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Lkcwn-0000yI-Hx for qemu-devel@nongnu.org; Fri, 20 Mar 2009 07:31:33 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n2KBVXn6017053 for ; Fri, 20 Mar 2009 07:31:33 -0400 From: Gerd Hoffmann Date: Fri, 20 Mar 2009 12:31:29 +0100 Message-Id: <1237548689-8677-4-git-send-email-kraxel@redhat.com> In-Reply-To: <1237548689-8677-1-git-send-email-kraxel@redhat.com> References: <1237548689-8677-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH 3/3] vnc: throttle screen updates. Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann This patch makes the vnc server code skip screen refreshes in case there is data in the output buffer. This reduces the refresh rate to throttle the bandwidth needed in case the network link is saturated. Signed-off-by: Gerd Hoffmann --- vnc.c | 11 ++++++++++- vnc.h | 1 + 2 files changed, 11 insertions(+), 1 deletions(-) diff --git a/vnc.c b/vnc.c index de9edea..6d93215 100644 --- a/vnc.c +++ b/vnc.c @@ -657,6 +657,7 @@ static void send_framebuffer_update(VncState *vs, int x, int y, int w, int h) static void vnc_copy(VncState *vs, int src_x, int src_y, int dst_x, int dst_y, int w, int h) { + vs->force_update = 1; vnc_update_client(vs); vnc_write_u8(vs, 0); /* msg id */ @@ -710,6 +711,12 @@ static void vnc_update_client(void *opaque) int saved_offset; int has_dirty = 0; + if (vs->output.offset && !vs->audio_cap && !vs->force_update) { + /* kernel send buffers are full -> drop frames to throttle */ + qemu_mod_timer(vs->timer, qemu_get_clock(rt_clock) + VNC_REFRESH_INTERVAL); + return; + } + vga_hw_update(); /* @@ -745,7 +752,7 @@ static void vnc_update_client(void *opaque) server_row += ds_get_linesize(vs->ds); } - if (!has_dirty && !vs->audio_cap) { + if (!has_dirty && !vs->audio_cap && !vs->force_update) { qemu_mod_timer(vs->timer, qemu_get_clock(rt_clock) + VNC_REFRESH_INTERVAL); return; } @@ -789,6 +796,7 @@ static void vnc_update_client(void *opaque) vs->output.buffer[saved_offset] = (n_rectangles >> 8) & 0xFF; vs->output.buffer[saved_offset + 1] = n_rectangles & 0xFF; vnc_flush(vs); + vs->force_update = 0; } @@ -1407,6 +1415,7 @@ static void framebuffer_update_request(VncState *vs, int incremental, int i; vs->need_update = 1; + vs->force_update = 1; if (!incremental) { for (i = 0; i < h; i++) { vnc_set_bits(vs->guest.dirty[y_position + i], diff --git a/vnc.h b/vnc.h index ce9aa49..3ae95f3 100644 --- a/vnc.h +++ b/vnc.h @@ -121,6 +121,7 @@ struct VncState VncDisplay *vd; int need_update; + int force_update; uint32_t features; int absolute; int last_x; -- 1.6.1.3