From f228c26520dcfdc2d600ba78c51796ef2a4a31fd Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Wed, 17 Aug 2022 14:19:36 -0700 Subject: [PATCH] llvmpipe: Add some missing locking The lp_rasterizer is shared across contexts, and lp_rast_fence called without holding rast_mutex could race with rast_mutex being replaced and unref'd on a different thread. Fixes: a680fd078c0 ("llvmpipe: make last_fence a screen/rast object not a context one.") Signed-off-by: Rob Clark Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/llvmpipe/lp_flush.c | 2 ++ src/gallium/drivers/llvmpipe/lp_setup.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/gallium/drivers/llvmpipe/lp_flush.c b/src/gallium/drivers/llvmpipe/lp_flush.c index c49836432a9..ee509010f37 100644 --- a/src/gallium/drivers/llvmpipe/lp_flush.c +++ b/src/gallium/drivers/llvmpipe/lp_flush.c @@ -57,7 +57,9 @@ llvmpipe_flush( struct pipe_context *pipe, /* ask the setup module to flush */ lp_setup_flush(llvmpipe->setup, reason); + mtx_lock(&screen->rast_mutex); lp_rast_fence(screen->rast, (struct lp_fence **)fence); + mtx_unlock(&screen->rast_mutex); if (fence && (!*fence)) *fence = (struct pipe_fence_handle *)lp_fence_create(0); diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c index cf2317186ee..89519c96611 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup.c +++ b/src/gallium/drivers/llvmpipe/lp_setup.c @@ -1714,7 +1714,9 @@ lp_setup_end_query(struct lp_setup_context *setup, struct llvmpipe_query *pq) } else { struct llvmpipe_screen *screen = llvmpipe_screen(setup->pipe->screen); + mtx_lock(&screen->rast_mutex); lp_rast_fence(screen->rast, &pq->fence); + mtx_unlock(&screen->rast_mutex); } fail: