[PATCH 1/2] drm/radeon: improve ring lockup detection code
Alex Deucher
alexdeucher at gmail.com
Tue Feb 18 10:39:21 PST 2014
On Tue, Feb 18, 2014 at 11:52 AM, Christian König
<deathsimple at vodafone.de> wrote:
> From: Christian König <christian.koenig at amd.com>
>
> Use atomics and jiffies_64, so that we don't need to have the
> ring mutex locked any more and avoid wrap arounds.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
Series is:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> drivers/gpu/drm/radeon/radeon.h | 4 ++--
> drivers/gpu/drm/radeon/radeon_ring.c | 21 +++++++++------------
> 2 files changed, 11 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index a415f8e..9269413 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -802,8 +802,8 @@ struct radeon_ring {
> unsigned ring_size;
> unsigned ring_free_dw;
> int count_dw;
> - unsigned long last_activity;
> - unsigned last_rptr;
> + atomic_t last_rptr;
> + atomic64_t last_activity;
> uint64_t gpu_addr;
> uint32_t align_mask;
> uint32_t ptr_mask;
> diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
> index b14c86d..ae72108 100644
> --- a/drivers/gpu/drm/radeon/radeon_ring.c
> +++ b/drivers/gpu/drm/radeon/radeon_ring.c
> @@ -485,8 +485,8 @@ void radeon_ring_unlock_undo(struct radeon_device *rdev, struct radeon_ring *rin
> void radeon_ring_lockup_update(struct radeon_device *rdev,
> struct radeon_ring *ring)
> {
> - ring->last_rptr = radeon_ring_get_rptr(rdev, ring);
> - ring->last_activity = jiffies;
> + atomic_set(&ring->last_rptr, radeon_ring_get_rptr(rdev, ring));
> + atomic64_set(&ring->last_activity, jiffies_64);
> }
>
> /**
> @@ -498,22 +498,19 @@ void radeon_ring_lockup_update(struct radeon_device *rdev,
> bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
> {
> uint32_t rptr = radeon_ring_get_rptr(rdev, ring);
> - unsigned long cjiffies, elapsed;
> + uint64_t last = atomic64_read(&ring->last_activity);
> + uint64_t elapsed;
>
> - cjiffies = jiffies;
> - if (!time_after(cjiffies, ring->last_activity)) {
> - /* likely a wrap around */
> - radeon_ring_lockup_update(rdev, ring);
> - return false;
> - }
> - if (rptr != ring->last_rptr) {
> + if (rptr != atomic_read(&ring->last_rptr)) {
> /* CP is still working no lockup */
> radeon_ring_lockup_update(rdev, ring);
> return false;
> }
> - elapsed = jiffies_to_msecs(cjiffies - ring->last_activity);
> +
> + elapsed = jiffies_to_msecs(jiffies_64 - last);
> if (radeon_lockup_timeout && elapsed >= radeon_lockup_timeout) {
> - dev_err(rdev->dev, "GPU lockup CP stall for more than %lumsec\n", elapsed);
> + dev_err(rdev->dev, "GPU lockup ring %d stall for more "
> + "than %Lumsec\n", ring->idx, elapsed);
> return true;
> }
> /* give a chance to the GPU ... */
> --
> 1.8.3.2
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list