From: Kaitao Cheng <[email protected]>

A later change will make list_for_each_entry() cache the next element
before entering the loop body. __intel_gt_unset_wedged() drops
timelines->lock while waiting on a fence and then restarts the walk from
the list head after the lock is reacquired.

Keep the loop open-coded so the next timeline is selected after that
restart logic has run. This preserves the existing lock-drop traversal
semantics and prepares the code for the list iterator update.

Signed-off-by: Kaitao Cheng <[email protected]>
---
 drivers/gpu/drm/i915/gt/intel_reset.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_reset.c 
b/drivers/gpu/drm/i915/gt/intel_reset.c
index adff482a6c9c..fe0d87e248a7 100644
--- a/drivers/gpu/drm/i915/gt/intel_reset.c
+++ b/drivers/gpu/drm/i915/gt/intel_reset.c
@@ -1077,7 +1077,9 @@ static bool __intel_gt_unset_wedged(struct intel_gt *gt)
         * No more can be submitted until we reset the wedged bit.
         */
        spin_lock(&timelines->lock);
-       list_for_each_entry(tl, &timelines->active_list, link) {
+       for (tl = list_first_entry(&timelines->active_list, typeof(*tl), link);
+            !list_entry_is_head(tl, &timelines->active_list, link);
+            tl = list_next_entry(tl, link)) {
                struct dma_fence *fence;
 
                fence = i915_active_fence_get(&tl->last_request);
-- 
2.43.0

Reply via email to