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

Author: Rob Clark <robdcl...@chromium.org>
Date:   Wed Nov  1 09:42:21 2023 -0700

freedreno/drm: Fix race in zombie import

The check for the zombie case (racing with final unref of the bo vs
removal from table) must be atomic.

Fixes 
spec@ext_image_dma_buf_import@ext_image_dma_buf_import-refcount-multithread

Fixes: a192923f99e1 ("freedreno/drm: Restart import on zombie race")
Signed-off-by: Rob Clark <robdcl...@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25995>

---

 src/freedreno/drm/freedreno_bo.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/src/freedreno/drm/freedreno_bo.c b/src/freedreno/drm/freedreno_bo.c
index 3f15f52e799..3c8ed16a59f 100644
--- a/src/freedreno/drm/freedreno_bo.c
+++ b/src/freedreno/drm/freedreno_bo.c
@@ -61,15 +61,12 @@ lookup_bo(struct hash_table *tbl, uint32_t key)
        * remove an object it is about to free.  Fortunately since table
        * lookup and removal are protected by the same lock (and table
        * removal happens before obj free) we can easily detect this by
-       * checking for refcnt==0.
+       * checking for refcnt==0 (ie. 1 after p_atomic_inc_return).
        */
-      if (bo->refcnt == 0) {
+      if (p_atomic_inc_return(&bo->refcnt) == 1) {
          return &zombie;
       }
 
-      /* found, incr refcnt and return: */
-      fd_bo_ref(bo);
-
       if (!list_is_empty(&bo->node)) {
          mesa_logw("bo was in cache, size=%u, alloc_flags=0x%x\n",
                    bo->size, bo->alloc_flags);

Reply via email to