blob: 3de4e2f43d73aa2cfebc3d85bfdf2a9f362cbe3b (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
vnc: 0.171
graphic: 0.152
semantic: 0.127
other: 0.123
device: 0.077
PID: 0.056
performance: 0.049
boot: 0.047
permissions: 0.041
network: 0.038
debug: 0.036
socket: 0.033
files: 0.026
KVM: 0.025
debug: 0.506
vnc: 0.213
network: 0.123
graphic: 0.046
boot: 0.022
performance: 0.020
other: 0.016
files: 0.014
PID: 0.010
device: 0.008
socket: 0.006
semantic: 0.005
KVM: 0.005
permissions: 0.005
[Qemu-devel] [BUG] VNC: client won't send FramebufferUpdateRequest if job in flight is aborted
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 ?
|