[Spice-devel] [PATCH spice] Fix dcc_start() regression

Frediano Ziglio fziglio at redhat.com
Tue Mar 8 15:28:00 UTC 2016


> 
> Commit e9ed125d introduced a dead-lock regression by taking twice the
> same lock recursively. The previous code checked if a dmabuf was set
> without taking the lock, for queuing scanout messages. Since the message
> is being processed later on, it make sense to queue and delay until it
> is sent to check if there is a scanout.
> 

Acked.

Frediano


> backtrace:
>  #0  red_qxl_get_gl_scanout (qxl_state=0x5555582373c0) at red-qxl.c:828
>  #1  0x00007fffec1ae654 in marshall_gl_scanout (rcc=0x7fffda6a7010,
>  #m=0x7fff44025e60, item=0x7fff440958a0) at dcc-send.c:2310
>  #2  0x00007fffec1aec7b in dcc_send_item (dcc=0x7fffda6a7010,
>  #pipe_item=0x7fff440958a0) at dcc-send.c:2441
>  #3  0x00007fffec1730f6 in send_item (rcc=0x7fffda6a7010,
>  #item=0x7fff440958a0) at display-channel.c:1963
>  #4  0x00007fffec1504c3 in
>  #red_channel_client_send_item (rcc=0x7fffda6a7010, item=0x7fff440958a0)
>  #at red-channel.c:578
>  #5  0x00007fffec152d98 in red_channel_client_push (rcc=0x7fffda6a7010)
>  #at red-channel.c:1365
>  #6  0x00007fffec1a387e in dcc_push_monitors_config (dcc=0x7fffda6a7010)
>  #at dcc.c:563
>  #7  0x00007fffec1a3489 in dcc_start (dcc=0x7fffda6a7010) at dcc.c:475
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau at redhat.com>
> ---
>  server/dcc.c | 15 ++++-----------
>  1 file changed, 4 insertions(+), 11 deletions(-)
> 
> diff --git a/server/dcc.c b/server/dcc.c
> index 70a9b99..1f71423 100644
> --- a/server/dcc.c
> +++ b/server/dcc.c
> @@ -446,7 +446,6 @@ void dcc_start(DisplayChannelClient *dcc)
>  {
>      DisplayChannel *display = DCC_TO_DC(dcc);
>      RedChannelClient *rcc = RED_CHANNEL_CLIENT(dcc);
> -    QXLInstance *qxl = display->common.qxl;
>  
>      red_channel_client_push_set_ack(RED_CHANNEL_CLIENT(dcc));
>  
> @@ -467,17 +466,11 @@ void dcc_start(DisplayChannelClient *dcc)
>          dcc_create_all_streams(dcc);
>      }
>  
> -    SpiceMsgDisplayGlScanoutUnix *scanout = red_qxl_get_gl_scanout(qxl->st);
> -    if (scanout) {
> -        if (reds_stream_is_plain_unix(rcc->stream) &&
> -            red_channel_client_test_remote_cap(rcc,
> SPICE_DISPLAY_CAP_GL_SCANOUT)) {
> -            red_channel_client_pipe_add(rcc, dcc_gl_scanout_item_new(rcc,
> NULL, 0));
> -            dcc_push_monitors_config(dcc);
> -        } else {
> -            spice_printerr("FIXME: GL not supported on this kind of
> connection");
> -        }
> +    if (reds_stream_is_plain_unix(rcc->stream) &&
> +        red_channel_client_test_remote_cap(rcc,
> SPICE_DISPLAY_CAP_GL_SCANOUT)) {
> +        red_channel_client_pipe_add(rcc, dcc_gl_scanout_item_new(rcc, NULL,
> 0));
> +        dcc_push_monitors_config(dcc);
>      }
> -    red_qxl_put_gl_scanout(qxl->st, scanout);
>  }
>  
>  static void dcc_destroy_stream_agents(DisplayChannelClient *dcc)
> --
> 2.5.0
> 
> 


More information about the Spice-devel mailing list