Hi

On Tue, Mar 15, 2022 at 11:24 AM Wen, Jianxian <jianxian....@verisilicon.com>
wrote:

> 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....@verisilicon.com>
> Signed-off-by: Lu Gao <lu....@verisilicon.com>
> ---
>  ui/vnc.c | 26 +++++++++++++++++---------
>  1 file changed, 17 insertions(+), 9 deletions(-)
>
> diff --git a/ui/vnc.c b/ui/vnc.c
> index 3ccd33dedc..310a873c21 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.33.0
>
>
lgtm,

Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com>

-- 
Marc-André Lureau

Reply via email to