Module: Mesa
Branch: staging/21.1
Commit: ac9392ba1ad1fc87c4c321d1f65d9741e837e619
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=ac9392ba1ad1fc87c4c321d1f65d9741e837e619

Author: Alyssa Rosenzweig <[email protected]>
Date:   Thu May 13 17:24:31 2021 -0400

panfrost: Fix major flaw in BO cache

BOs in the cache are chronological, so we try oldest BOs first. That
means if we find the oldest BO is busy, likely every BO is busy, and we
should bail early. This dramatically reduces the useless cycles spent in
bo_wait.

I studied the BO cache of the following drivers, all of which handle
this correctly: iris, lima, etnaviv, freedreno, vc4, v3d, v3dv.

Signed-off-by: Alyssa Rosenzweig <[email protected]>
Cc: mesa-stable
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10794>
(cherry picked from commit 77d04989135233c7b276bca3912ab07a12d9f362)

---

 .pick_status.json         | 2 +-
 src/panfrost/lib/pan_bo.c | 4 +++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 192d4c37d77..8e47f6df3fc 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -13,7 +13,7 @@
         "description": "panfrost: Fix major flaw in BO cache",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "master_sha": null,
         "because_sha": null
     },
diff --git a/src/panfrost/lib/pan_bo.c b/src/panfrost/lib/pan_bo.c
index dbfce02e519..8e9e257a812 100644
--- a/src/panfrost/lib/pan_bo.c
+++ b/src/panfrost/lib/pan_bo.c
@@ -201,9 +201,11 @@ panfrost_bo_cache_fetch(struct panfrost_device *dev,
                 if (entry->size < size || entry->flags != flags)
                         continue;
 
+                /* If the oldest BO in the cache is busy, likely so is
+                 * everything newer, so bail. */
                 if (!panfrost_bo_wait(entry, dontwait ? 0 : INT64_MAX,
                                       PAN_BO_ACCESS_RW))
-                        continue;
+                        break;
 
                 struct drm_panfrost_madvise madv = {
                         .handle = entry->gem_handle,

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to