freedreno/drm: Add locked version fd_{bo,pipe}_del()
authorRob Clark <robdclark@chromium.org>
Thu, 22 Apr 2021 20:30:35 +0000 (13:30 -0700)
committerMarge Bot <eric+marge@anholt.net>
Wed, 28 Apr 2021 15:36:42 +0000 (15:36 +0000)
This will be needed in the next patch, so we can reuse the bo table_lock
for fence related locking.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10444>

src/freedreno/drm/freedreno_bo.c
src/freedreno/drm/freedreno_pipe.c
src/freedreno/drm/freedreno_priv.h

index f7adb45..f1c7254 100644 (file)
@@ -254,26 +254,43 @@ fd_bo_ref(struct fd_bo *bo)
    return bo;
 }
 
-void
-fd_bo_del(struct fd_bo *bo)
+static void
+bo_del_or_recycle(struct fd_bo *bo)
 {
    struct fd_device *dev = bo->dev;
 
-   if (!p_atomic_dec_zero(&bo->refcnt))
-      return;
-
-   simple_mtx_lock(&table_lock);
+   simple_mtx_assert_locked(&table_lock);
 
    if ((bo->bo_reuse == BO_CACHE) &&
        (fd_bo_cache_free(&dev->bo_cache, bo) == 0))
-      goto out;
+      return;
+
    if ((bo->bo_reuse == RING_CACHE) &&
        (fd_bo_cache_free(&dev->ring_cache, bo) == 0))
-      goto out;
+      return;
 
    bo_del(bo);
+}
+
+void
+fd_bo_del_locked(struct fd_bo *bo)
+{
+   simple_mtx_assert_locked(&table_lock);
+
+   if (!p_atomic_dec_zero(&bo->refcnt))
+      return;
+
+   bo_del_or_recycle(bo);
+}
 
-out:
+void
+fd_bo_del(struct fd_bo *bo)
+{
+   if (!p_atomic_dec_zero(&bo->refcnt))
+      return;
+
+   simple_mtx_lock(&table_lock);
+   bo_del_or_recycle(bo);
    simple_mtx_unlock(&table_lock);
 }
 
index c0e069f..b7e633f 100644 (file)
@@ -84,6 +84,15 @@ fd_pipe_del(struct fd_pipe *pipe)
    pipe->funcs->destroy(pipe);
 }
 
+void
+fd_pipe_del_locked(struct fd_pipe *pipe)
+{
+   simple_mtx_assert_locked(&table_lock);
+   if (!p_atomic_dec_zero(&pipe->refcnt))
+      return;
+   pipe->funcs->destroy(pipe);
+}
+
 int
 fd_pipe_get_param(struct fd_pipe *pipe, enum fd_param_id param, uint64_t *value)
 {
index c9f77fb..d20cc78 100644 (file)
@@ -137,7 +137,9 @@ struct fd_bo *fd_bo_cache_alloc(struct fd_bo_cache *cache, uint32_t *size,
 int fd_bo_cache_free(struct fd_bo_cache *cache, struct fd_bo *bo);
 
 /* for where @table_lock is already held: */
+void fd_bo_del_locked(struct fd_bo *bo);
 void fd_device_del_locked(struct fd_device *dev);
+void fd_pipe_del_locked(struct fd_pipe *pipe);
 
 struct fd_pipe_funcs {
    struct fd_ringbuffer *(*ringbuffer_new_object)(struct fd_pipe *pipe,