panfrost: Don't return imported/exported BOs to the cache
authorBoris Brezillon <boris.brezillon@collabora.com>
Sat, 14 Sep 2019 09:46:44 +0000 (11:46 +0200)
committerBoris Brezillon <boris.brezillon@collabora.com>
Wed, 18 Sep 2019 08:35:52 +0000 (10:35 +0200)
We don't know who else is using the BO in that case, and thus shouldn't
re-use it for something else.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/gallium/drivers/panfrost/pan_bo.c
src/gallium/drivers/panfrost/pan_bo.h

index 5d0f296cc4fbb1ef5ab49743f0a745fff4d15a77..209d1e0d71e53a6a2d98ea15c2d3a4ffa46d4e58 100644 (file)
@@ -182,6 +182,9 @@ panfrost_bo_cache_put(struct panfrost_bo *bo)
 {
         struct panfrost_screen *screen = bo->screen;
 
+        if (bo->flags & PAN_BO_DONT_REUSE)
+                return false;
+
         pthread_mutex_lock(&screen->bo_cache_lock);
         struct list_head *bucket = pan_bucket(screen, bo->size);
         struct drm_panfrost_madvise madv;
@@ -352,6 +355,7 @@ panfrost_bo_import(struct panfrost_screen *screen, int fd)
         bo->gem_handle = gem_handle;
         bo->gpu = (mali_ptr) get_bo_offset.offset;
         bo->size = lseek(fd, 0, SEEK_END);
+        bo->flags |= PAN_BO_DONT_REUSE;
         assert(bo->size > 0);
         pipe_reference_init(&bo->reference, 1);
 
@@ -372,6 +376,7 @@ panfrost_bo_export(struct panfrost_bo *bo)
         if (ret == -1)
                 return -1;
 
+        bo->flags |= PAN_BO_DONT_REUSE;
         return args.fd;
 }
 
index 2858d3782eff47db7db96d7718cc5258f2cc4875..33fbddff336946307edab19f4b07f074fd0bdf8d 100644 (file)
@@ -52,6 +52,10 @@ struct panfrost_screen;
  * (semantically distinct from INVISIBLE, which cannot never be mmaped) */
 #define PAN_BO_DELAY_MMAP         (1 << 4)
 
+/* Some BOs shouldn't be returned back to the reuse BO cache, use this flag to
+ * let the BO logic know about this contraint. */
+#define PAN_BO_DONT_REUSE         (1 << 5)
+
 struct panfrost_bo {
         /* Must be first for casting */
         struct list_head link;