drm/amdgpu: track guilty fence for queue reset

If we've already seen a fence, don't backup the
ring contents since presumably either the previous reset
was not successful or there was something wrong with the
data.

Reviewed-by: Jesse Zhang <jesse.zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Alex Deucher 2026-05-15 10:16:51 -04:00
parent 930a915de8
commit ce3f23a780
2 changed files with 12 additions and 0 deletions

View File

@ -803,6 +803,17 @@ void amdgpu_ring_backup_unprocessed_commands(struct amdgpu_ring *ring,
seq = ring->fence_drv.sync_seq & ring->fence_drv.num_fences_mask;
ring->ring_backup_entries_to_copy = 0;
/* if we've already seen this fence, return early.
* ring->ring_backup_entries_to_copy is set to 0 so
* the reemit helper will return early as well to
* avoid getting stuck in a reemit loop.
*/
if (ring->guilty_fence == guilty_fence) {
ring->guilty_fence = NULL;
return;
}
ring->guilty_fence = guilty_fence;
do {
last_seq++;
last_seq &= ring->fence_drv.num_fences_mask;

View File

@ -314,6 +314,7 @@ struct amdgpu_ring {
uint32_t *ring_backup;
unsigned int ring_backup_entries_to_copy;
bool reemit;
struct amdgpu_fence *guilty_fence;
unsigned rptr_offs;
u64 rptr_gpu_addr;
u32 *rptr_cpu_addr;