[PATCH 3/3] shared
Chris Wilson
chris at chris-wilson.co.uk
Mon Jan 29 09:22:58 UTC 2018
---
drivers/dma-buf/reservation.c | 81 +++++++++++++------------------------------
1 file changed, 24 insertions(+), 57 deletions(-)
diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c
index baa7b2784d32..2ec67593630c 100644
--- a/drivers/dma-buf/reservation.c
+++ b/drivers/dma-buf/reservation.c
@@ -482,24 +482,6 @@ long reservation_object_wait_timeout_rcu(struct reservation_object *obj,
}
EXPORT_SYMBOL_GPL(reservation_object_wait_timeout_rcu);
-
-static inline int
-reservation_object_test_signaled_single(struct dma_fence *passed_fence)
-{
- struct dma_fence *fence, *lfence = passed_fence;
- int ret = 1;
-
- if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &lfence->flags)) {
- fence = dma_fence_get_rcu(lfence);
- if (!fence)
- return -1;
-
- ret = !!dma_fence_is_signaled(fence);
- dma_fence_put(fence);
- }
- return ret;
-}
-
/**
* reservation_object_test_signaled_rcu - Test if a reservation object's
* fences have been signaled.
@@ -513,53 +495,38 @@ reservation_object_test_signaled_single(struct dma_fence *passed_fence)
bool reservation_object_test_signaled_rcu(struct reservation_object *obj,
bool test_all)
{
- unsigned seq, shared_count;
- int ret;
+ unsigned int seq;
+ bool ret;
rcu_read_lock();
-retry:
- ret = true;
- shared_count = 0;
- seq = read_seqcount_begin(&obj->seq);
-
- if (test_all) {
- unsigned i;
-
- struct reservation_object_list *fobj =
- rcu_dereference(obj->fence);
+ do {
+ unsigned int shared_count = 0;
+ struct dma_fence *fence;
- if (fobj)
- shared_count = fobj->shared_count;
+ seq = read_seqcount_begin(&obj->seq);
- for (i = 0; i < shared_count; ++i) {
- struct dma_fence *fence = rcu_dereference(fobj->shared[i]);
+ ret = true;
+ if (test_all) {
+ struct reservation_object_list *fobj =
+ rcu_dereference(obj->fence);
+ unsigned int i;
- ret = reservation_object_test_signaled_single(fence);
- if (ret < 0)
- goto retry;
- else if (!ret)
- break;
+ shared_count = fobj ? fobj->shared_count : 0;
+ for (i = 0; i < shared_count; i++) {
+ fence = rcu_dereference(fobj->shared[i]);
+ ret = dma_fence_is_signaled(fence);
+ if (!ret)
+ break;
+ }
}
-
- if (read_seqcount_retry(&obj->seq, seq))
- goto retry;
- }
-
- if (!shared_count) {
- struct dma_fence *fence_excl = rcu_dereference(obj->fence_excl);
-
- if (fence_excl) {
- ret = reservation_object_test_signaled_single(
- fence_excl);
- if (ret < 0)
- goto retry;
-
- if (read_seqcount_retry(&obj->seq, seq))
- goto retry;
+ if (!shared_count) {
+ fence = rcu_dereference(obj->fence_excl);
+ if (fence)
+ ret = dma_fence_is_signaled(fence);
}
- }
-
+ } while (ret && read_seqcount_retry(&obj->seq, seq));
rcu_read_unlock();
+
return ret;
}
EXPORT_SYMBOL_GPL(reservation_object_test_signaled_rcu);
--
2.15.1
More information about the Intel-gfx-trybot
mailing list