[Mesa-dev] [PATCH v2] vc4: Mark BOs as purgeable when they enter the BO cache

Eric Anholt eric at anholt.net
Thu Oct 5 18:25:46 UTC 2017


Boris Brezillon <boris.brezillon at free-electrons.com> writes:

> This patch makes use of the DRM_IOCTL_VC4_GEM_MADVISE ioctl to mark all
> BOs placed in the mesa BO cache as purgeable so that the system can
> reclaim this memory under memory pressure.
>
> Signed-off-by: Boris Brezillon <boris.brezillon at free-electrons.com>
> ---
> Hello,
>
> Note that this series depends on kernel code that has not been accepted
> yet and is just provided to show reviewers how the ioctl can be used
> and what to expect from it.
>
> Please do not consider this for inclusion in MESA until the kernel part
> has been accepted.
>
> Thanks,
>
> Boris
> ---


>  static struct vc4_bo *
>  vc4_bo_from_cache(struct vc4_screen *screen, uint32_t size, const char *name)
>  {
>          struct vc4_bo_cache *cache = &screen->bo_cache;
>          uint32_t page_index = size / 4096 - 1;
> +        struct vc4_bo *iter, *tmp, *bo = NULL;
>  
>          if (cache->size_list_size <= page_index)
>                  return NULL;
>  
> -        struct vc4_bo *bo = NULL;
>          mtx_lock(&cache->lock);
> -        if (!list_empty(&cache->size_list[page_index])) {
> -                bo = LIST_ENTRY(struct vc4_bo, cache->size_list[page_index].next,
> -                                size_list);
> -
> -                /* Check that the BO has gone idle.  If not, then we want to
> -                 * allocate something new instead, since we assume that the
> -                 * user will proceed to CPU map it and fill it with stuff.
> +	LIST_FOR_EACH_ENTRY_SAFE(iter, tmp, &cache->size_list[page_index],
> +				 size_list) {
> +                /* Check that the BO has gone idle. If not, then we try the
> +                 * next one in the list, and if none of them are idle then
> +                 * we want to allocate something new instead, since we assume
> +                 * that the user will proceed to CPU map it and fill it with
> +                 * stuff.
>                   */
> -                if (!vc4_bo_wait(bo, 0, NULL)) {
> -                        mtx_unlock(&cache->lock);
> -                        return NULL;
> -                }
> -
> +                if (!vc4_bo_wait(iter, 0, NULL))
> +                        continue;

Since things get pushed onto the list in the order they will become
available, we can just break when we get a busy one.

Other than that, and needing a re-import of vc4_drm.h in
include/drm-uapi (see README), this patch is:

Reviewed-by: Eric Anholt <eric at anholt.net>

I don't think I'll get to review of the kernel side today -- it'll take
a bit more concentration than I have right now.

> +
> +                if (!vc4_bo_unpurgeable(iter)) {
> +                        /* The BO has been purged. Free it and try to find
> +                         * another one in the cache.
> +                         */
> +                        vc4_bo_remove_from_cache(cache, iter);
> +                        vc4_bo_free(iter);
> +                        continue;
> +		}
> +
> +                bo = iter;
>                  pipe_reference_init(&bo->reference, 1);
>                  vc4_bo_remove_from_cache(cache, bo);
>  
>                  bo->name = name;
> +                break;
>          }
>          mtx_unlock(&cache->lock);
>          return bo;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20171005/31c2deb6/attachment.sig>


More information about the mesa-dev mailing list