Skip to content

Commit 1f22fcb

Browse files
committed
drm/amdgpu: handle wrap around in reemit handling
Compare the sequence numbers directly. Fixes: 77cc0da ("drm/amdgpu: track ring state associated with a fence") Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 357d90b commit 1f22fcb

1 file changed

Lines changed: 10 additions & 5 deletions

File tree

drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -790,14 +790,19 @@ void amdgpu_ring_backup_unprocessed_commands(struct amdgpu_ring *ring,
790790
struct dma_fence *unprocessed;
791791
struct dma_fence __rcu **ptr;
792792
struct amdgpu_fence *fence;
793-
u64 wptr, i, seqno;
793+
u64 wptr;
794+
u32 seq, last_seq;
794795

795-
seqno = amdgpu_fence_read(ring);
796+
last_seq = amdgpu_fence_read(ring) & ring->fence_drv.num_fences_mask;
797+
seq = ring->fence_drv.sync_seq & ring->fence_drv.num_fences_mask;
796798
wptr = ring->fence_drv.signalled_wptr;
797799
ring->ring_backup_entries_to_copy = 0;
798800

799-
for (i = seqno + 1; i <= ring->fence_drv.sync_seq; ++i) {
800-
ptr = &ring->fence_drv.fences[i & ring->fence_drv.num_fences_mask];
801+
do {
802+
last_seq++;
803+
last_seq &= ring->fence_drv.num_fences_mask;
804+
805+
ptr = &ring->fence_drv.fences[last_seq];
801806
rcu_read_lock();
802807
unprocessed = rcu_dereference(*ptr);
803808

@@ -813,7 +818,7 @@ void amdgpu_ring_backup_unprocessed_commands(struct amdgpu_ring *ring,
813818
wptr = fence->wptr;
814819
}
815820
rcu_read_unlock();
816-
}
821+
} while (last_seq != seq);
817822
}
818823

819824
/*

0 commit comments

Comments
 (0)