qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [BUG] VNC: client won't send FramebufferUpdateRequest if jo


From: Ying Fang
Subject: [Qemu-devel] [BUG] VNC: client won't send FramebufferUpdateRequest if job in flight is aborted
Date: Tue, 5 Mar 2019 14:16:22 +0800
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0

Hi Gerd, Daniel.

We noticed that if VncSharePolicy was configured with 
VNC_SHARE_POLICY_FORCE_SHARED mode and
multiple vnc clients opened vnc connections, some clients could go blank screen 
at high probability.
This problem can be reproduced when we regularly reboot suse12sp3 in graphic 
mode both
with RealVNC and noVNC client.

Then we dig into it and find out that some clients go blank screen because they 
don't
send FramebufferUpdateRequest any more. One step further, we notice that each 
time
the job in flight is aborted one client go blank screen.

The bug is triggered in the following procedure.
Guest reboot => graphic mode switch => graphic_hw_update =>  vga_update_display
=> vga_draw_graphic (full_update = 1) => dpy_gfx_replace_surface => 
vnc_dpy_switch =>
vnc_abort_display_jobs (client may have job in flight) => job removed from the 
queue
If one client has vnc job in flight, *vnc_abort_display_jobs* will wait until 
its job is abandoned.
This behavior is done in vnc_worker_thread_loop when 'if (job->vs->ioc == NULL 
|| job->vs->abort == true)'
branch is taken.

As we can see, *vnc_abort_display_jobs* is intended to do some optimization to 
avoid unnecessary client update.
But if client sends FramebufferUpdateRequest for some graphic area and its 
FramebufferUpdate response job
is abandoned, the client may wait for the response and never send new 
FramebufferUpdateRequest, which may
case the client go blank screen forever.

So I am wondering whether we should drop the *vnc_abort_display_jobs*  
optimization  or do some trick here
to push the client to send new FramebufferUpdateRequest. Do you have any idea ?




reply via email to

[Prev in Thread] Current Thread [Next in Thread]