[Mesa-dev] [PATCH 2/2] panfrost: Add madvise support to BO cache
Tomeu Vizoso
tomeu.vizoso at collabora.com
Fri Aug 16 11:59:10 UTC 2019
Both patches look good to me.
Reviewed-by: Tomeu Vizoso <tomeu.vizoso at collabora.com>
Thanks!
Tomeu
On Fri, 9 Aug 2019 at 21:53, Rob Herring <robh at kernel.org> wrote:
>
> The kernel now supports madvise ioctl to indicate which BOs can be freed
> when there is memory pressure. Mark BOs purgeable when they are in the
> BO cache. The BOs must also be munmapped when they are in the cache or
> they cannot be purged.
>
> We could optimize avoiding the madvise ioctl on older kernels once the
> driver version bump lands, but probably not worth it given the other
> driver features also being added.
>
> Signed-off-by: Rob Herring <robh at kernel.org>
> ---
> src/gallium/drivers/panfrost/pan_bo_cache.c | 21 +++++++++++++++++++++
> src/gallium/drivers/panfrost/pan_drm.c | 4 ++--
> 2 files changed, 23 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/drivers/panfrost/pan_bo_cache.c b/src/gallium/drivers/panfrost/pan_bo_cache.c
> index 7378d0a8abea..239ea0b46cb2 100644
> --- a/src/gallium/drivers/panfrost/pan_bo_cache.c
> +++ b/src/gallium/drivers/panfrost/pan_bo_cache.c
> @@ -23,6 +23,8 @@
> * Authors (Collabora):
> * Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
> */
> +#include <xf86drm.h>
> +#include "drm-uapi/panfrost_drm.h"
>
> #include "pan_screen.h"
> #include "util/u_math.h"
> @@ -88,9 +90,21 @@ panfrost_bo_cache_fetch(
> list_for_each_entry_safe(struct panfrost_bo, entry, bucket, link) {
> if (entry->size >= size &&
> entry->flags == flags) {
> + int ret;
> + struct drm_panfrost_madvise madv;
> +
> /* This one works, splice it out of the cache */
> list_del(&entry->link);
>
> + madv.handle = entry->gem_handle;
> + madv.madv = PANFROST_MADV_WILLNEED;
> + madv.retained = 0;
> +
> + ret = drmIoctl(screen->fd, DRM_IOCTL_PANFROST_MADVISE, &madv);
> + if (!ret && !madv.retained) {
> + panfrost_drm_release_bo(screen, entry, false);
> + continue;
> + }
> /* Let's go! */
> return entry;
> }
> @@ -109,6 +123,13 @@ panfrost_bo_cache_put(
> struct panfrost_bo *bo)
> {
> struct list_head *bucket = pan_bucket(screen, bo->size);
> + struct drm_panfrost_madvise madv;
> +
> + madv.handle = bo->gem_handle;
> + madv.madv = PANFROST_MADV_DONTNEED;
> + madv.retained = 0;
> +
> + drmIoctl(screen->fd, DRM_IOCTL_PANFROST_MADVISE, &madv);
>
> /* Add us to the bucket */
> list_addtail(&bo->link, bucket);
> diff --git a/src/gallium/drivers/panfrost/pan_drm.c b/src/gallium/drivers/panfrost/pan_drm.c
> index 36a6b975680a..28a4287202bd 100644
> --- a/src/gallium/drivers/panfrost/pan_drm.c
> +++ b/src/gallium/drivers/panfrost/pan_drm.c
> @@ -163,6 +163,8 @@ panfrost_drm_release_bo(struct panfrost_screen *screen, struct panfrost_bo *bo,
> /* Rather than freeing the BO now, we'll cache the BO for later
> * allocations if we're allowed to */
>
> + panfrost_drm_munmap_bo(screen, bo);
> +
> if (cacheable) {
> bool cached = panfrost_bo_cache_put(screen, bo);
>
> @@ -172,8 +174,6 @@ panfrost_drm_release_bo(struct panfrost_screen *screen, struct panfrost_bo *bo,
>
> /* Otherwise, if the BO wasn't cached, we'll legitimately free the BO */
>
> - panfrost_drm_munmap_bo(screen, bo);
> -
> ret = drmIoctl(screen->fd, DRM_IOCTL_GEM_CLOSE, &gem_close);
> if (ret) {
> fprintf(stderr, "DRM_IOCTL_GEM_CLOSE failed: %m\n");
> --
> 2.20.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list