static void dma_resv_iter_walk_unlocked()

in dma-resv.c [355:384]


static void dma_resv_iter_walk_unlocked(struct dma_resv_iter *cursor)
{
	struct dma_resv *obj = cursor->obj;

	do {
		/* Drop the reference from the previous round */
		dma_fence_put(cursor->fence);

		if (cursor->index == -1) {
			cursor->fence = dma_resv_excl_fence(obj);
			cursor->index++;
			if (!cursor->fence)
				continue;

		} else if (!cursor->fences ||
			   cursor->index >= cursor->shared_count) {
			cursor->fence = NULL;
			break;

		} else {
			struct dma_resv_list *fences = cursor->fences;
			unsigned int idx = cursor->index++;

			cursor->fence = rcu_dereference(fences->shared[idx]);
		}
		cursor->fence = dma_fence_get_rcu(cursor->fence);
		if (!cursor->fence || !dma_fence_is_signaled(cursor->fence))
			break;
	} while (true);
}