radeon: Stop the ttm workqueue while reclocking
authorMatthew Garrett <mjg@redhat.com>
Mon, 26 Apr 2010 20:02:26 +0000 (16:02 -0400)
committerDave Airlie <airlied@redhat.com>
Tue, 18 May 2010 08:21:22 +0000 (18:21 +1000)
The ttm bo workqueue may touch objects while we're reclocking, so make
sure it's blocked until we're done.

Signed-off-by: Matthew Garrett <mjg@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/radeon_pm.c

index c9390ea56f9688036b9567afdfa6c0a94bf52e0a..79d3336eede57ae399ee23127d637aadad88dadd 100644 (file)
@@ -460,9 +460,11 @@ bool radeon_pm_debug_check_in_vbl(struct radeon_device *rdev, bool finish)
 static void radeon_pm_idle_work_handler(struct work_struct *work)
 {
        struct radeon_device *rdev;
+       int resched;
        rdev = container_of(work, struct radeon_device,
                                pm.idle_work.work);
 
+       resched = ttm_bo_lock_delayed_workqueue(&rdev->mman.bdev);
        mutex_lock(&rdev->ddev->struct_mutex);
        mutex_lock(&rdev->pm.mutex);
        if (rdev->pm.state == PM_STATE_ACTIVE) {
@@ -509,6 +511,7 @@ static void radeon_pm_idle_work_handler(struct work_struct *work)
        }
        mutex_unlock(&rdev->pm.mutex);
        mutex_unlock(&rdev->ddev->struct_mutex);
+       ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
 
        queue_delayed_work(rdev->wq, &rdev->pm.idle_work,
                                        msecs_to_jiffies(RADEON_IDLE_LOOP_MS));