On Fri, Jul 02, 2021 at 01:16:40PM +0200, Christian König wrote:
> As the name implies if testing all fences is requested we
> should indeed test all fences and not skip the exclusive
> one because we see shared ones.
> 
> v2: fix logic once more
> 
> Signed-off-by: Christian König <[email protected]>

Reviewed-by: Daniel Vetter <[email protected]>

> ---
>  drivers/dma-buf/dma-resv.c | 33 ++++++++++++---------------------
>  1 file changed, 12 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c
> index 4ab02b6c387a..18dd5a6ca06c 100644
> --- a/drivers/dma-buf/dma-resv.c
> +++ b/drivers/dma-buf/dma-resv.c
> @@ -618,25 +618,21 @@ static inline int dma_resv_test_signaled_single(struct 
> dma_fence *passed_fence)
>   */
>  bool dma_resv_test_signaled(struct dma_resv *obj, bool test_all)
>  {
> -     unsigned int seq, shared_count;
> +     struct dma_fence *fence;
> +     unsigned int seq;
>       int ret;
>  
>       rcu_read_lock();
>  retry:
>       ret = true;
> -     shared_count = 0;
>       seq = read_seqcount_begin(&obj->seq);
>  
>       if (test_all) {
>               struct dma_resv_list *fobj = dma_resv_shared_list(obj);
> -             unsigned int i;
> -
> -             if (fobj)
> -                     shared_count = fobj->shared_count;
> +             unsigned int i, shared_count;
>  
> +             shared_count = fobj ? fobj->shared_count : 0;
>               for (i = 0; i < shared_count; ++i) {
> -                     struct dma_fence *fence;
> -
>                       fence = rcu_dereference(fobj->shared[i]);
>                       ret = dma_resv_test_signaled_single(fence);
>                       if (ret < 0)
> @@ -644,24 +640,19 @@ bool dma_resv_test_signaled(struct dma_resv *obj, bool 
> test_all)
>                       else if (!ret)
>                               break;
>               }
> -
> -             if (read_seqcount_retry(&obj->seq, seq))
> -                     goto retry;
>       }
>  
> -     if (!shared_count) {
> -             struct dma_fence *fence_excl = dma_resv_excl_fence(obj);
> -
> -             if (fence_excl) {
> -                     ret = dma_resv_test_signaled_single(fence_excl);
> -                     if (ret < 0)
> -                             goto retry;
> +     fence = dma_resv_excl_fence(obj);
> +     if (ret && fence) {
> +             ret = dma_resv_test_signaled_single(fence);
> +             if (ret < 0)
> +                     goto retry;
>  
> -                     if (read_seqcount_retry(&obj->seq, seq))
> -                             goto retry;
> -             }
>       }
>  
> +     if (read_seqcount_retry(&obj->seq, seq))
> +             goto retry;
> +
>       rcu_read_unlock();
>       return ret;
>  }
> -- 
> 2.25.1
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch

Reply via email to