Both patches look good to me. Reviewed-by: Tomeu Vizoso <tomeu.viz...@collabora.com>
Thanks! Tomeu On Fri, 9 Aug 2019 at 21:53, Rob Herring <r...@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 <r...@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.rosenzw...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev