Commit 1f22fcb8 authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/amdgpu: handle wrap around in reemit handling



Compare the sequence numbers directly.

Fixes: 77cc0da3 ("drm/amdgpu: track ring state associated with a fence")
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 357d90be
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -790,14 +790,19 @@ void amdgpu_ring_backup_unprocessed_commands(struct amdgpu_ring *ring,
	struct dma_fence *unprocessed;
	struct dma_fence __rcu **ptr;
	struct amdgpu_fence *fence;
	u64 wptr, i, seqno;
	u64 wptr;
	u32 seq, last_seq;

	seqno = amdgpu_fence_read(ring);
	last_seq = amdgpu_fence_read(ring) & ring->fence_drv.num_fences_mask;
	seq = ring->fence_drv.sync_seq & ring->fence_drv.num_fences_mask;
	wptr = ring->fence_drv.signalled_wptr;
	ring->ring_backup_entries_to_copy = 0;

	for (i = seqno + 1; i <= ring->fence_drv.sync_seq; ++i) {
		ptr = &ring->fence_drv.fences[i & ring->fence_drv.num_fences_mask];
	do {
		last_seq++;
		last_seq &= ring->fence_drv.num_fences_mask;

		ptr = &ring->fence_drv.fences[last_seq];
		rcu_read_lock();
		unprocessed = rcu_dereference(*ptr);

@@ -813,7 +818,7 @@ void amdgpu_ring_backup_unprocessed_commands(struct amdgpu_ring *ring,
			wptr = fence->wptr;
		}
		rcu_read_unlock();
	}
	} while (last_seq != seq);
}

/*