Skip to content

Commit

Permalink
drm/msm: Handle fence rollover
Browse files Browse the repository at this point in the history
Add some helpers for fence comparision, which handle rollover properly,
and stop open coding fence seqno comparisions.

Signed-off-by: Rob Clark <[email protected]>
Reviewed-by: Akhil P Oommen <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Rob Clark <[email protected]>
  • Loading branch information
robclark committed Nov 28, 2021
1 parent c28e2f2 commit 5f3aee4
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 5 deletions.
2 changes: 1 addition & 1 deletion drivers/gpu/drm/msm/msm_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -967,7 +967,7 @@ static int wait_fence(struct msm_gpu_submitqueue *queue, uint32_t fence_id,
struct dma_fence *fence;
int ret;

if (fence_id > queue->last_fence) {
if (fence_after(fence_id, queue->last_fence)) {
DRM_ERROR_RATELIMITED("waiting on invalid fence: %u (of %u)\n",
fence_id, queue->last_fence);
return -EINVAL;
Expand Down
12 changes: 12 additions & 0 deletions drivers/gpu/drm/msm/msm_fence.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,16 @@ void msm_update_fence(struct msm_fence_context *fctx, uint32_t fence);

struct dma_fence * msm_fence_alloc(struct msm_fence_context *fctx);

static inline bool
fence_before(uint32_t a, uint32_t b)
{
return (int32_t)(a - b) < 0;
}

static inline bool
fence_after(uint32_t a, uint32_t b)
{
return (int32_t)(a - b) > 0;
}

#endif
6 changes: 3 additions & 3 deletions drivers/gpu/drm/msm/msm_gpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ static void update_fences(struct msm_gpu *gpu, struct msm_ringbuffer *ring,

spin_lock_irqsave(&ring->submit_lock, flags);
list_for_each_entry(submit, &ring->submits, node) {
if (submit->seqno > fence)
if (fence_after(submit->seqno, fence))
break;

msm_update_fence(submit->ring->fctx,
Expand Down Expand Up @@ -509,7 +509,7 @@ static void hangcheck_handler(struct timer_list *t)
if (fence != ring->hangcheck_fence) {
/* some progress has been made.. ya! */
ring->hangcheck_fence = fence;
} else if (fence < ring->seqno) {
} else if (fence_before(fence, ring->seqno)) {
/* no progress and not done.. hung! */
ring->hangcheck_fence = fence;
DRM_DEV_ERROR(dev->dev, "%s: hangcheck detected gpu lockup rb %d!\n",
Expand All @@ -523,7 +523,7 @@ static void hangcheck_handler(struct timer_list *t)
}

/* if still more pending work, reset the hangcheck timer: */
if (ring->seqno > ring->hangcheck_fence)
if (fence_after(ring->seqno, ring->hangcheck_fence))
hangcheck_timer_reset(gpu);

/* workaround for missing irq: */
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/msm/msm_gpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ static inline bool msm_gpu_active(struct msm_gpu *gpu)
for (i = 0; i < gpu->nr_rings; i++) {
struct msm_ringbuffer *ring = gpu->rb[i];

if (ring->seqno > ring->memptrs->fence)
if (fence_after(ring->seqno, ring->memptrs->fence))
return true;
}

Expand Down

0 comments on commit 5f3aee4

Please sign in to comment.