[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