Mesa (main): crocus: optimise bo_unref path a little.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jul 5 05:14:01 UTC 2021


Module: Mesa
Branch: main
Commit: be5bb3146a47dd76e87a79c1ec1965d2450240ca
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=be5bb3146a47dd76e87a79c1ec1965d2450240ca

Author: Dave Airlie <airlied at redhat.com>
Date:   Mon Jul  5 05:11:26 2021 +1000

crocus: optimise bo_unref path a little.

This just splits it into the atomic/non-atomic paths

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11707>

---

 src/gallium/drivers/crocus/crocus_bufmgr.c | 37 ++++++++----------------------
 src/gallium/drivers/crocus/crocus_bufmgr.h | 24 ++++++++++++++++++-
 2 files changed, 33 insertions(+), 28 deletions(-)

diff --git a/src/gallium/drivers/crocus/crocus_bufmgr.c b/src/gallium/drivers/crocus/crocus_bufmgr.c
index fa80b2a1155..5efa47289ab 100644
--- a/src/gallium/drivers/crocus/crocus_bufmgr.c
+++ b/src/gallium/drivers/crocus/crocus_bufmgr.c
@@ -115,16 +115,6 @@ get_time(void)
 
 #define FILE_DEBUG_FLAG DEBUG_BUFMGR
 
-static inline int
-atomic_add_unless(int *v, int add, int unless)
-{
-   int c, old;
-   c = p_atomic_read(v);
-   while (c != unless && (old = p_atomic_cmpxchg(v, c, c + add)) != c)
-      c = old;
-   return c == unless;
-}
-
 struct bo_cache_bucket {
    /** List of cached BOs. */
    struct list_head head;
@@ -720,28 +710,21 @@ bo_unreference_final(struct crocus_bo *bo, time_t time)
 }
 
 void
-crocus_bo_unreference(struct crocus_bo *bo)
+__crocus_bo_unreference(struct crocus_bo *bo)
 {
-   if (bo == NULL)
-      return;
-
-   assert(p_atomic_read(&bo->refcount) > 0);
-
-   if (atomic_add_unless(&bo->refcount, -1, 1)) {
-      struct crocus_bufmgr *bufmgr = bo->bufmgr;
-      struct timespec time;
-
-      clock_gettime(CLOCK_MONOTONIC, &time);
+   struct crocus_bufmgr *bufmgr = bo->bufmgr;
+   struct timespec time;
 
-      mtx_lock(&bufmgr->lock);
+   clock_gettime(CLOCK_MONOTONIC, &time);
 
-      if (p_atomic_dec_zero(&bo->refcount)) {
-         bo_unreference_final(bo, time.tv_sec);
-         cleanup_bo_cache(bufmgr, time.tv_sec);
-      }
+   mtx_lock(&bufmgr->lock);
 
-      mtx_unlock(&bufmgr->lock);
+   if (p_atomic_dec_zero(&bo->refcount)) {
+      bo_unreference_final(bo, time.tv_sec);
+      cleanup_bo_cache(bufmgr, time.tv_sec);
    }
+
+   mtx_unlock(&bufmgr->lock);
 }
 
 static void
diff --git a/src/gallium/drivers/crocus/crocus_bufmgr.h b/src/gallium/drivers/crocus/crocus_bufmgr.h
index 0ec2af5bc69..0f3408c1233 100644
--- a/src/gallium/drivers/crocus/crocus_bufmgr.h
+++ b/src/gallium/drivers/crocus/crocus_bufmgr.h
@@ -186,11 +186,33 @@ crocus_bo_reference(struct crocus_bo *bo)
    p_atomic_inc(&bo->refcount);
 }
 
+static inline int
+atomic_add_unless(int *v, int add, int unless)
+{
+   int c, old;
+   c = p_atomic_read(v);
+   while (c != unless && (old = p_atomic_cmpxchg(v, c, c + add)) != c)
+      c = old;
+   return c == unless;
+}
+
+void __crocus_bo_unreference(struct crocus_bo *bo);
+
 /**
  * Releases a reference on a buffer object, freeing the data if
  * no references remain.
  */
-void crocus_bo_unreference(struct crocus_bo *bo);
+static inline void crocus_bo_unreference(struct crocus_bo *bo)
+{
+   if (bo == NULL)
+      return;
+
+   assert(p_atomic_read(&bo->refcount) > 0);
+
+   if (atomic_add_unless(&bo->refcount, -1, 1)) {
+      __crocus_bo_unreference(bo);
+   }
+}
 
 #define MAP_READ          PIPE_MAP_READ
 #define MAP_WRITE         PIPE_MAP_WRITE



More information about the mesa-commit mailing list