etnaviv: Use reentrant screen lock around flush
authorMarek Vasut <marex@denx.de>
Mon, 3 Jun 2019 22:22:49 +0000 (00:22 +0200)
committerLucas Stach <l.stach@pengutronix.de>
Wed, 14 Aug 2019 08:36:36 +0000 (10:36 +0200)
The flush callback may be called on the same pipe context, and thus
the same stream, from two different threads of execution. However,
etna_cmd_stream_flush{,2}() must not be called on the same stream
from two different threads of execution as that would mess up the
etna_bo refcounting and likely have other ugly side effects.

Fix this by using a reentrant screen lock around the flush callback.

Signed-off-by: Marek Vasut <marex@denx.de>
Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
Reviewed-by: Lucas Stach <l.stach@pengutronix.de>
src/gallium/drivers/etnaviv/etnaviv_context.c

index 47eeeecfc74e4cd98a8320ffaa684d7ae20909f8..e49aaacf8fc5b922d4a343f8dacd8ef5b328c266 100644 (file)
@@ -310,8 +310,11 @@ etna_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence,
            enum pipe_flush_flags flags)
 {
    struct etna_context *ctx = etna_context(pctx);
+   struct etna_screen *screen = ctx->screen;
    int out_fence_fd = -1;
 
+   mtx_lock(&screen->lock);
+
    list_for_each_entry(struct etna_hw_query, hq, &ctx->active_hw_queries, node)
       etna_hw_query_suspend(hq, ctx);
 
@@ -324,6 +327,8 @@ etna_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence,
 
    if (fence)
       *fence = etna_fence_create(pctx, out_fence_fd);
+
+   mtx_unlock(&screen->lock);
 }
 
 static void