[v2,16/37] panfrost: Don't return imported/exported BOs to the cache

Submitted by Boris Brezillon on Sept. 16, 2019, 9:36 a.m.

Details

Message ID 20190916093715.32203-17-boris.brezillon@collabora.com
State Accepted
Commit 9af4aeaaf7c88c80718caf10041e63545b202e2b
Headers show
Series "panfrost: Support batch pipelining" ( rev: 1 ) in Mesa

Not browsing as part of any series.

Commit Message

Boris Brezillon Sept. 16, 2019, 9:36 a.m.
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>
---
 src/gallium/drivers/panfrost/pan_bo.c | 5 +++++
 src/gallium/drivers/panfrost/pan_bo.h | 4 ++++
 2 files changed, 9 insertions(+)

Patch hide | download patch | download mbox

diff --git a/src/gallium/drivers/panfrost/pan_bo.c b/src/gallium/drivers/panfrost/pan_bo.c
index 5d0f296cc4fb..209d1e0d71e5 100644
--- a/src/gallium/drivers/panfrost/pan_bo.c
+++ b/src/gallium/drivers/panfrost/pan_bo.c
@@ -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;
 }
 
diff --git a/src/gallium/drivers/panfrost/pan_bo.h b/src/gallium/drivers/panfrost/pan_bo.h
index 2858d3782eff..33fbddff3369 100644
--- a/src/gallium/drivers/panfrost/pan_bo.h
+++ b/src/gallium/drivers/panfrost/pan_bo.h
@@ -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;

Comments

R-b. Wonder why this never broke anything else either.

On Mon, Sep 16, 2019 at 11:36:54AM +0200, Boris Brezillon wrote:
> 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>
> ---
>  src/gallium/drivers/panfrost/pan_bo.c | 5 +++++
>  src/gallium/drivers/panfrost/pan_bo.h | 4 ++++
>  2 files changed, 9 insertions(+)
> 
> diff --git a/src/gallium/drivers/panfrost/pan_bo.c b/src/gallium/drivers/panfrost/pan_bo.c
> index 5d0f296cc4fb..209d1e0d71e5 100644
> --- a/src/gallium/drivers/panfrost/pan_bo.c
> +++ b/src/gallium/drivers/panfrost/pan_bo.c
> @@ -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;
>  }
>  
> diff --git a/src/gallium/drivers/panfrost/pan_bo.h b/src/gallium/drivers/panfrost/pan_bo.h
> index 2858d3782eff..33fbddff3369 100644
> --- a/src/gallium/drivers/panfrost/pan_bo.h
> +++ b/src/gallium/drivers/panfrost/pan_bo.h
> @@ -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;
> -- 
> 2.21.0