| From 7729492571a4fb27da7663df270df132b9e169d0 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 15 Sep 2025 12:37:32 -0400 |
| Subject: drm/amdgpu: handle wrap around in reemit handling |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Alex Deucher <alexander.deucher@amd.com> |
| |
| [ Upstream commit 1f22fcb88bfef26a966e9eb242c692c6bf253d47 ] |
| |
| Compare the sequence numbers directly. |
| |
| Fixes: 77cc0da39c7c ("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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 15 ++++++++++----- |
| 1 file changed, 10 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c |
| index 9e7506965cab2..bb17af79c24a6 100644 |
| --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c |
| @@ -791,14 +791,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); |
| |
| @@ -814,7 +819,7 @@ void amdgpu_ring_backup_unprocessed_commands(struct amdgpu_ring *ring, |
| wptr = fence->wptr; |
| } |
| rcu_read_unlock(); |
| - } |
| + } while (last_seq != seq); |
| } |
| |
| /* |
| -- |
| 2.51.0 |
| |