Commit 9d38814d authored by Christian König's avatar Christian König
Browse files

dma-buf: fix dma_resv_test_signaled test_all handling v2



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: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20210702111642.17259-3-christian.koenig@amd.com
parent a0356899
Loading
Loading
Loading
Loading
+12 −21
Original line number Diff line number Diff line
@@ -615,25 +615,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)
@@ -641,23 +637,18 @@ 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);
	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;
		}
	}

	rcu_read_unlock();
	return ret;