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 <christian.koenig@xxxxxxx> Reviewed-by: Daniel Vetter <daniel.vetter@xxxxxxxx> > --- > 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