Skip to content

Commit 097c69d

Browse files
vizhaoalexdeucher
authored andcommitted
drm/amdkfd: make sure ring buffer is flushed before update wptr
In a consecutive packet submission, for example unmap and query status, when CP is reading wptr caused by unmap packet doorbell ring, if in some case CP operates slower (e.g. doorbell_mode=1) and wptr has been updated to next packet (query status), but the query status packet content has not been flushed to memory yet, it will cause CP fetched stalled data. Adding mb to ensure ring buffer has been updated before updating wptr. Also adding a mb to ensure wptr updated before doorbell ring. Signed-off-by: Victor Zhao <[email protected]> Reviewed-by: Christian König <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 349af06 commit 097c69d

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,12 +306,17 @@ int kq_submit_packet(struct kernel_queue *kq)
306306
if (amdgpu_amdkfd_is_fed(kq->dev->adev))
307307
return -EIO;
308308

309+
/* Make sure ring buffer is updated before wptr updated */
310+
mb();
311+
309312
if (kq->dev->kfd->device_info.doorbell_size == 8) {
310313
*kq->wptr64_kernel = kq->pending_wptr64;
314+
mb(); /* Make sure wptr updated before ring doorbell */
311315
write_kernel_doorbell64(kq->queue->properties.doorbell_ptr,
312316
kq->pending_wptr64);
313317
} else {
314318
*kq->wptr_kernel = kq->pending_wptr;
319+
mb(); /* Make sure wptr updated before ring doorbell */
315320
write_kernel_doorbell(kq->queue->properties.doorbell_ptr,
316321
kq->pending_wptr);
317322
}

0 commit comments

Comments
 (0)