]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915: use the new iterator in i915_sw_fence_await_reservation v3
authorChristian König <christian.koenig@amd.com>
Mon, 13 Sep 2021 09:45:31 +0000 (11:45 +0200)
committerChristian König <christian.koenig@amd.com>
Wed, 17 Nov 2021 13:24:15 +0000 (14:24 +0100)
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.

Signed-off-by: Christian König <christian.koenig@amd.com>
Acked-by: Daniel Vetter <daniel@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20211116102431.198905-4-christian.koenig@amd.com
drivers/gpu/drm/i915/i915_sw_fence.c

index c589a681da77e26075e0b06e734da52ef373774e..7ea0dbf81530be4d913e29194f280d486694cc58 100644 (file)
@@ -572,56 +572,25 @@ 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,
+       dma_resv_iter_begin(&cursor, resv, write);
+       dma_resv_for_each_fence_unlocked(&cursor, f) {
+               pending = i915_sw_fence_await_dma_fence(fence, f, timeout,
                                                        gfp);
-               if (pending < 0)
+               if (pending < 0) {
                        ret = pending;
-               else
-                       ret |= pending;
-       }
-
-       dma_fence_put(excl);
+                       break;
+               }
 
+               ret |= pending;
+       }
+       dma_resv_iter_end(&cursor);
        return ret;
 }