From 1faced9ec71f1256d176fc07b3bb2a92f2506173 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: (cherry picked from commit f228c26520dcfdc2d600ba78c51796ef2a4a31fd) --- .pick_status.json | 2 +- src/gallium/drivers/llvmpipe/lp_flush.c | 2 ++ src/gallium/drivers/llvmpipe/lp_setup.c | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index ce7b8ed8e3c..e3d29281521 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -418,7 +418,7 @@ "description": "llvmpipe: Add some missing locking", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "a680fd078c0a7574b60fbf9a7e5c9f42c97a744e" }, 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 4adfa705914..239e17f53db 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: