[Spice-commits] server/dcc.c

Frediano Ziglio fziglio at kemper.freedesktop.org
Tue Mar 8 15:26:37 UTC 2016


 server/dcc.c |   15 ++++-----------
 1 file changed, 4 insertions(+), 11 deletions(-)

New commits:
commit acd53b97fb5c8b108c3f8e9bac0515c589cc76d9
Author: Marc-André Lureau <marcandre.lureau at gmail.com>
Date:   Tue Mar 8 15:50:17 2016 +0100

    Fix dcc_start() regression
    
    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.
    
    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>
    Acked-by: Frediano Ziglio <fziglio at redhat.com>

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)


More information about the Spice-commits mailing list