From 8f97262cddc9950df6c5a8eddaff5135b2c78b9a Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Tue, 4 Jun 2019 00:22:49 +0200 Subject: [PATCH] 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 Reviewed-by: Christian Gmeiner Reviewed-by: Lucas Stach --- 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 -- 2.30.2