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

Author: Rob Clark <[email protected]>
Date:   Mon Dec  4 09:06:59 2023 -0800

freedreno/drm: Fix zombie BO import harder

Fixes: 6ac133c646dd ("freedreno/drm: Fix race in zombie import")
Signed-off-by: Rob Clark <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26506>

---

 src/freedreno/drm/freedreno_bo.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/freedreno/drm/freedreno_bo.c b/src/freedreno/drm/freedreno_bo.c
index efde63ec73f..3a52fc56c8d 100644
--- a/src/freedreno/drm/freedreno_bo.c
+++ b/src/freedreno/drm/freedreno_bo.c
@@ -64,6 +64,15 @@ lookup_bo(struct hash_table *tbl, uint32_t key)
        * checking for refcnt==0 (ie. 1 after p_atomic_inc_return).
        */
       if (p_atomic_inc_return(&bo->refcnt) == 1) {
+         /* Restore the zombified reference count, so if another thread
+          * that ends up calling lookup_bo() gets the table_lock before
+          * the thread deleting the bo does, it doesn't mistakenly see
+          * that the BO is live.
+          *
+          * We are holding the table_lock here so we can't be racing
+          * with another caller of lookup_bo()
+          */
+         p_atomic_dec(&bo->refcnt);
          return &zombie;
       }
 

Reply via email to