Re: [PATCH libdrm] etnaviv: fix BO cache to properly work with different flags
2017-12-15 11:30 GMT+01:00 Lucas Stach: > Currently if the oldest BO in a bucket has different flags than what we > look for we'll miss the cache.Fix this by iterating over the cached BOs > until we find the oldest one with matching flags. This improves the hit > ratio for some of the buckets. > > Signed-off-by: Lucas Stach Reviewed-by: Christian Gmeiner > --- > etnaviv/etnaviv_bo_cache.c | 26 +++--- > 1 file changed, 19 insertions(+), 7 deletions(-) > > diff --git a/etnaviv/etnaviv_bo_cache.c b/etnaviv/etnaviv_bo_cache.c > index 8924651f0cd8..6208230dc81a 100644 > --- a/etnaviv/etnaviv_bo_cache.c > +++ b/etnaviv/etnaviv_bo_cache.c > @@ -124,20 +124,32 @@ static int is_idle(struct etna_bo *bo) > > static struct etna_bo *find_in_bucket(struct etna_bo_bucket *bucket, > uint32_t flags) > { > - struct etna_bo *bo = NULL; > + struct etna_bo *bo = NULL, *tmp; > > pthread_mutex_lock(_lock); > - while (!LIST_IS_EMPTY(>list)) { > - bo = LIST_ENTRY(struct etna_bo, bucket->list.next, list); > > - if (bo->flags == flags && is_idle(bo)) { > - list_del(>list); > - break; > + if (LIST_IS_EMPTY(>list)) > + goto out_unlock; > + > + LIST_FOR_EACH_ENTRY_SAFE(bo, tmp, >list, list) { > + /* skip BOs with different flags */ > + if (bo->flags != flags) > + continue; > + > + /* check if the first BO with matching flags is idle */ > + if (is_idle(bo)) { > + list_delinit(>list); > + goto out_unlock; > } > > - bo = NULL; > + /* If the oldest BO is still busy, don't try younger ones */ > break; > } > + > + /* There was no matching buffer found */ > + bo = NULL; > + > +out_unlock: > pthread_mutex_unlock(_lock); > > return bo; > -- > 2.11.0 > > ___ > etnaviv mailing list > etna...@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/etnaviv -- greets -- Christian Gmeiner, MSc https://christian-gmeiner.info ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH libdrm] etnaviv: fix BO cache to properly work with different flags
On Fri, 2017-12-15 at 11:30 +0100, Lucas Stach wrote: > Currently if the oldest BO in a bucket has different flags than what we > look for we'll miss the cache.Fix this by iterating over the cached BOs > until we find the oldest one with matching flags. This improves the hit > ratio for some of the buckets. > > Signed-off-by: Lucas StachReviewed-by: Philipp Zabel regards Philipp > --- > etnaviv/etnaviv_bo_cache.c | 26 +++--- > 1 file changed, 19 insertions(+), 7 deletions(-) > > diff --git a/etnaviv/etnaviv_bo_cache.c b/etnaviv/etnaviv_bo_cache.c > index 8924651f0cd8..6208230dc81a 100644 > --- a/etnaviv/etnaviv_bo_cache.c > +++ b/etnaviv/etnaviv_bo_cache.c > @@ -124,20 +124,32 @@ static int is_idle(struct etna_bo *bo) > > static struct etna_bo *find_in_bucket(struct etna_bo_bucket *bucket, > uint32_t flags) > { > - struct etna_bo *bo = NULL; > + struct etna_bo *bo = NULL, *tmp; > > pthread_mutex_lock(_lock); > - while (!LIST_IS_EMPTY(>list)) { > - bo = LIST_ENTRY(struct etna_bo, bucket->list.next, list); > > - if (bo->flags == flags && is_idle(bo)) { > - list_del(>list); > - break; > + if (LIST_IS_EMPTY(>list)) > + goto out_unlock; > + > + LIST_FOR_EACH_ENTRY_SAFE(bo, tmp, >list, list) { > + /* skip BOs with different flags */ > + if (bo->flags != flags) > + continue; > + > + /* check if the first BO with matching flags is idle */ > + if (is_idle(bo)) { > + list_delinit(>list); > + goto out_unlock; > } > > - bo = NULL; > + /* If the oldest BO is still busy, don't try younger ones */ > break; > } > + > + /* There was no matching buffer found */ > + bo = NULL; > + > +out_unlock: > pthread_mutex_unlock(_lock); > > return bo; ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel