Module: Mesa
Branch: master
Commit: 8f97262cddc9950df6c5a8eddaff5135b2c78b9a
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=8f97262cddc9950df6c5a8eddaff5135b2c78b9a

Author: Marek Vasut <ma...@denx.de>
Date:   Tue Jun  4 00:22:49 2019 +0200

etnaviv: Use reentrant screen lock around flush

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 <ma...@denx.de>
Reviewed-by: Christian Gmeiner <christian.gmei...@gmail.com>
Reviewed-by: Lucas Stach <l.st...@pengutronix.de>

---

 src/gallium/drivers/etnaviv/etnaviv_context.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c 
b/src/gallium/drivers/etnaviv/etnaviv_context.c
index 47eeeecfc74..e49aaacf8fc 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_context.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_context.c
@@ -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

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to