From 2d0d867935cddf71ca30162c888f495f8fc7865e Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Mon, 8 Aug 2022 14:52:07 -0700 Subject: [PATCH] freedreno/drm: Avoid lock in fd_pipe_del() If we aren't dropping the last refcnt we don't need the lock. This avoids contention between retire-queue against others. Signed-off-by: Rob Clark Part-of: --- src/freedreno/drm/freedreno_pipe.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/freedreno/drm/freedreno_pipe.c b/src/freedreno/drm/freedreno_pipe.c index 579c98c040b..5d52573a724 100644 --- a/src/freedreno/drm/freedreno_pipe.c +++ b/src/freedreno/drm/freedreno_pipe.c @@ -108,11 +108,22 @@ fd_pipe_ref_locked(struct fd_pipe *pipe) return pipe; } + +static void +pipe_del_locked(struct fd_pipe *pipe) +{ + fd_bo_del_locked(pipe->control_mem); + fd_device_del_locked(pipe->dev); + pipe->funcs->destroy(pipe); +} + void fd_pipe_del(struct fd_pipe *pipe) { + if (!p_atomic_dec_zero(&pipe->refcnt)) + return; simple_mtx_lock(&table_lock); - fd_pipe_del_locked(pipe); + pipe_del_locked(pipe); simple_mtx_unlock(&table_lock); } @@ -122,9 +133,7 @@ fd_pipe_del_locked(struct fd_pipe *pipe) simple_mtx_assert_locked(&table_lock); if (!p_atomic_dec_zero(&pipe->refcnt)) return; - fd_bo_del_locked(pipe->control_mem); - fd_device_del_locked(pipe->dev); - pipe->funcs->destroy(pipe); + pipe_del_locked(pipe); } /**