[PATCH 1/2] resv

Chris Wilson chris at chris-wilson.co.uk
Sat Nov 12 02:28:42 UTC 2016


---
 drivers/dma-buf/reservation.c | 46 +++++++++++++++++++++----------------------
 1 file changed, 22 insertions(+), 24 deletions(-)

diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c
index 393817e849ed..64748a7ddc0c 100644
--- a/drivers/dma-buf/reservation.c
+++ b/drivers/dma-buf/reservation.c
@@ -283,24 +283,22 @@ int reservation_object_get_fences_rcu(struct reservation_object *obj,
 	struct dma_fence **shared = NULL;
 	struct dma_fence *fence_excl;
 	unsigned int shared_count;
-	int ret = 1;
 
-	do {
+	rcu_read_lock();
+	for (;;) {
 		struct reservation_object_list *fobj;
-		unsigned seq;
-		unsigned int i;
+		unsigned int seq, i;
 
 		shared_count = i = 0;
 
-		rcu_read_lock();
 		seq = read_seqcount_begin(&obj->seq);
 
 		fence_excl = rcu_dereference(obj->fence_excl);
 		if (fence_excl && !dma_fence_get_rcu(fence_excl))
-			goto unlock;
+			continue;
 
 		fobj = rcu_dereference(obj->fence);
-		if (fobj) {
+		if (fobj && fobj->shared_count) {
 			struct dma_fence **nshared;
 			size_t sz = sizeof(*shared) * fobj->shared_max;
 
@@ -308,15 +306,19 @@ int reservation_object_get_fences_rcu(struct reservation_object *obj,
 					   GFP_NOWAIT | __GFP_NOWARN);
 			if (!nshared) {
 				rcu_read_unlock();
+				dma_fence_put(fence_excl);
+
 				nshared = krealloc(shared, sz, GFP_KERNEL);
-				if (nshared) {
-					shared = nshared;
-					continue;
+				if (!nshared) {
+					kfree(shared);
+					return -ENOMEM;
 				}
 
-				ret = -ENOMEM;
-				break;
+				shared = nshared;
+				rcu_read_lock();
+				continue;
 			}
+
 			shared = nshared;
 			shared_count = fobj->shared_count;
 
@@ -327,17 +329,14 @@ int reservation_object_get_fences_rcu(struct reservation_object *obj,
 			}
 		}
 
-		if (i != shared_count || read_seqcount_retry(&obj->seq, seq)) {
-			while (i--)
-				dma_fence_put(shared[i]);
-			dma_fence_put(fence_excl);
-			goto unlock;
-		}
+		if (i == shared_count && !read_seqcount_retry(&obj->seq, seq))
+			break;
 
-		ret = 0;
-unlock:
-		rcu_read_unlock();
-	} while (ret);
+		while (i--)
+			dma_fence_put(shared[i]);
+		dma_fence_put(fence_excl);
+	}
+	rcu_read_unlock();
 
 	if (!shared_count) {
 		kfree(shared);
@@ -347,8 +346,7 @@ int reservation_object_get_fences_rcu(struct reservation_object *obj,
 	*pshared_count = shared_count;
 	*pshared = shared;
 	*pfence_excl = fence_excl;
-
-	return ret;
+	return 0;
 }
 EXPORT_SYMBOL_GPL(reservation_object_get_fences_rcu);
 
-- 
2.10.2



More information about the Intel-gfx-trybot mailing list