From: Christian König <deathsim...@vodafone.de>

We are locking the ring emission mutex anyway, so
there is no harm in doing it a bit earlier and
prevent multiple resets to happen at the same time.

Signed-off-by: Christian König <deathsim...@vodafone.de>
---
 drivers/gpu/drm/radeon/radeon_fence.c |   10 +++++-----
 drivers/gpu/drm/radeon/radeon_ring.c  |    2 --
 2 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_fence.c 
b/drivers/gpu/drm/radeon/radeon_fence.c
index 1610601..99c31b2 100644
--- a/drivers/gpu/drm/radeon/radeon_fence.c
+++ b/drivers/gpu/drm/radeon/radeon_fence.c
@@ -258,8 +258,11 @@ static int radeon_wait_seq(struct radeon_device *rdev, u64 
target_seq,
                        if (seq != 
atomic64_read(&rdev->fence_drv[ring].last_seq)) {
                                continue;
                        }
+
+                       mutex_lock(&rdev->ring_lock);
                        /* test if somebody else has already decided that this 
is a lockup */
                        if (last_activity != 
rdev->fence_drv[ring].last_activity) {
+                               mutex_unlock(&rdev->ring_lock);
                                continue;
                        }
 
@@ -273,15 +276,12 @@ static int radeon_wait_seq(struct radeon_device *rdev, 
u64 target_seq,
                                        rdev->fence_drv[i].last_activity = 
jiffies;
                                }
 
-                               /* change last activity so nobody else think 
there is a lockup */
-                               for (i = 0; i < RADEON_NUM_RINGS; ++i) {
-                                       rdev->fence_drv[i].last_activity = 
jiffies;
-                               }
-
                                /* mark the ring as not ready any more */
                                rdev->ring[ring].ready = false;
+                               mutex_unlock(&rdev->ring_lock);
                                return -EDEADLK;
                        }
+                       mutex_unlock(&rdev->ring_lock);
                }
        }
        return 0;
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c 
b/drivers/gpu/drm/radeon/radeon_ring.c
index 4ae222b..8b7f00e 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -408,7 +408,6 @@ void radeon_ring_force_activity(struct radeon_device *rdev, 
struct radeon_ring *
 {
        int r;
 
-       mutex_lock(&rdev->ring_lock);
        radeon_ring_free_size(rdev, ring);
        if (ring->rptr == ring->wptr) {
                r = radeon_ring_alloc(rdev, ring, 1);
@@ -417,7 +416,6 @@ void radeon_ring_force_activity(struct radeon_device *rdev, 
struct radeon_ring *
                        radeon_ring_commit(rdev, ring);
                }
        }
-       mutex_unlock(&rdev->ring_lock);
 }
 
 void radeon_ring_lockup_update(struct radeon_ring *ring)
-- 
1.7.7.6

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to