[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