On 17/09/2021 13:35, Christian König wrote:
Simplifying the code a bit.

v2: use dma_resv_for_each_fence instead, according to Tvrtko the lock is
     held here anyway.
v3: back to using dma_resv_for_each_fence_unlocked.

It did not work out - what happened?

Regards,

Tvrtko

Signed-off-by: Christian König <christian.koe...@amd.com>
---
  drivers/gpu/drm/i915/i915_sw_fence.c | 57 ++++++++--------------------
  1 file changed, 15 insertions(+), 42 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_sw_fence.c 
b/drivers/gpu/drm/i915/i915_sw_fence.c
index c589a681da77..7635b0478ea5 100644
--- a/drivers/gpu/drm/i915/i915_sw_fence.c
+++ b/drivers/gpu/drm/i915/i915_sw_fence.c
@@ -572,56 +572,29 @@ int i915_sw_fence_await_reservation(struct i915_sw_fence 
*fence,
                                    unsigned long timeout,
                                    gfp_t gfp)
  {
-       struct dma_fence *excl;
+       struct dma_resv_iter cursor;
+       struct dma_fence *f;
        int ret = 0, pending;
debug_fence_assert(fence);
        might_sleep_if(gfpflags_allow_blocking(gfp));
- if (write) {
-               struct dma_fence **shared;
-               unsigned int count, i;
-
-               ret = dma_resv_get_fences(resv, &excl, &count, &shared);
-               if (ret)
-                       return ret;
-
-               for (i = 0; i < count; i++) {
-                       if (shared[i]->ops == exclude)
-                               continue;
-
-                       pending = i915_sw_fence_await_dma_fence(fence,
-                                                               shared[i],
-                                                               timeout,
-                                                               gfp);
-                       if (pending < 0) {
-                               ret = pending;
-                               break;
-                       }
-
-                       ret |= pending;
-               }
-
-               for (i = 0; i < count; i++)
-                       dma_fence_put(shared[i]);
-               kfree(shared);
-       } else {
-               excl = dma_resv_get_excl_unlocked(resv);
-       }
-
-       if (ret >= 0 && excl && excl->ops != exclude) {
-               pending = i915_sw_fence_await_dma_fence(fence,
-                                                       excl,
-                                                       timeout,
+       rcu_read_lock();
+       dma_resv_iter_begin(&cursor, resv, write);
+       dma_resv_for_each_fence_unlocked(&cursor, f) {
+               rcu_read_unlock();
+               pending = i915_sw_fence_await_dma_fence(fence, f, timeout,
                                                        gfp);
-               if (pending < 0)
+               rcu_read_lock();
+               if (pending < 0) {
                        ret = pending;
-               else
-                       ret |= pending;
-       }
-
-       dma_fence_put(excl);
+                       break;
+               }
+ ret |= pending;
+       }
+       dma_resv_iter_end(&cursor);
+       rcu_read_unlock();
        return ret;
  }

Reply via email to