[PATCH 07/16] dma-buf: use new iterator in dma_buf_poll

Christian König ckoenig.leichtzumerken at gmail.com
Thu Jun 17 11:15:49 UTC 2021


This makes the function much simpler since the complex
retry logic is now handled elsewhere.

Signed-off-by: Christian König <christian.koenig at amd.com>
---
 drivers/dma-buf/dma-buf.c | 49 ++++-----------------------------------
 1 file changed, 4 insertions(+), 45 deletions(-)

diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
index b67fbf4e3705..4173f1f70ac1 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -207,15 +207,13 @@ static void dma_buf_poll_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
 
 static __poll_t dma_buf_poll(struct file *file, poll_table *poll)
 {
+	struct dma_resv_cursor cursor;
 	struct dma_buf_poll_cb_t *dcb;
 	struct dma_buf *dmabuf;
 	struct dma_resv *resv;
-	struct dma_resv_list *fobj;
-	struct dma_fence *fence_excl;
-	unsigned shared_count, seq;
 	struct dma_fence *fence;
 	__poll_t events;
-	int r, i;
+	int r;
 
 	dmabuf = file->private_data;
 	if (!dmabuf || !dmabuf->resv)
@@ -241,53 +239,14 @@ static __poll_t dma_buf_poll(struct file *file, poll_table *poll)
 	if (!events)
 		return 0;
 
-retry:
-	seq = read_seqcount_begin(&resv->seq);
-	rcu_read_lock();
-
-	fobj = rcu_dereference(resv->fence);
-	if (fobj && events & EPOLLOUT)
-		shared_count = fobj->shared_count;
-	else
-		shared_count = 0;
-
-	for (i = 0; i < shared_count; ++i) {
-		fence = rcu_dereference(fobj->shared[i]);
-		fence = dma_fence_get_rcu(fence);
-		if (!fence || read_seqcount_retry(&resv->seq, seq)) {
-			/* Concurrent modify detected, force re-check */
-			dma_fence_put(fence);
-			rcu_read_unlock();
-			goto retry;
-		}
-
-		r = dma_fence_add_callback(fence, &dcb->cb, dma_buf_poll_cb);
-		if (!r) {
-			/* Callback queued */
-			events = 0;
-			goto out;
-		}
-		dma_fence_put(fence);
-	}
-
-	fence = dma_resv_excl_fence(resv);
-	if (fence) {
-		fence = dma_fence_get_rcu(fence);
-		if (!fence || read_seqcount_retry(&resv->seq, seq)) {
-			/* Concurrent modify detected, force re-check */
-			dma_fence_put(fence);
-			rcu_read_unlock();
-			goto retry;
-
-		}
-
+	dma_resv_for_each_fence_unlocked(resv, &cursor, events & EPOLLOUT,
+					 fence) {
 		r = dma_fence_add_callback(fence, &dcb->cb, dma_buf_poll_cb);
 		if (!r) {
 			/* Callback queued */
 			events = 0;
 			goto out;
 		}
-		dma_fence_put(fence_excl);
 	}
 
 	/* No callback queued, wake up any additional waiters. */
-- 
2.25.1



More information about the dri-devel mailing list