Resolving deadlock problems with the cs_mutex.

Signed-off-by: Christian K?nig <deathsimple at vodafone.de>
---
 drivers/gpu/drm/radeon/radeon.h        |    2 +-
 drivers/gpu/drm/radeon/radeon_device.c |    1 +
 drivers/gpu/drm/radeon/radeon_gart.c   |   25 +++++++++----------------
 3 files changed, 11 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 138b952..f35957d 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -680,7 +680,6 @@ struct radeon_vm {
        u64                             pt_gpu_addr;
        u64                             *pt;
        struct radeon_sa_bo             sa_bo;
-       struct mutex                    mutex;
        /* last fence for cs using this vm */
        struct radeon_fence             *fence;
 };
@@ -1527,6 +1526,7 @@ struct radeon_device {
        struct radeon_pm                pm;
        uint32_t                        bios_scratch[RADEON_BIOS_NUM_SCRATCH];
        struct radeon_mutex             cs_mutex;
+       struct mutex                    vm_mutex;
        struct radeon_wb                wb;
        struct radeon_dummy_page        dummy_page;
        bool                            gpu_lockup;
diff --git a/drivers/gpu/drm/radeon/radeon_device.c 
b/drivers/gpu/drm/radeon/radeon_device.c
index ea7df16..cecb785 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -725,6 +725,7 @@ int radeon_device_init(struct radeon_device *rdev,
         * can recall function without having locking issues */
        radeon_mutex_init(&rdev->cs_mutex);
        radeon_mutex_init(&rdev->ib_pool.mutex);
+       mutex_init(&rdev->vm_mutex);
        for (i = 0; i < RADEON_NUM_RINGS; ++i)
                mutex_init(&rdev->ring[i].mutex);
        mutex_init(&rdev->dc_hw_i2c_mutex);
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c 
b/drivers/gpu/drm/radeon/radeon_gart.c
index c58a036..1b4933b 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -356,13 +356,13 @@ int radeon_vm_manager_suspend(struct radeon_device *rdev)
 {
        struct radeon_vm *vm, *tmp;

-       radeon_mutex_lock(&rdev->cs_mutex);
+       mutex_lock(&rdev->vm_mutex);
        /* unbind all active vm */
        list_for_each_entry_safe(vm, tmp, &rdev->vm_manager.lru_vm, list) {
                radeon_vm_unbind_locked(rdev, vm);
        }
        rdev->vm_manager.funcs->fini(rdev);
-       radeon_mutex_unlock(&rdev->cs_mutex);
+       mutex_unlock(&rdev->vm_mutex);
        return radeon_sa_bo_manager_suspend(rdev, &rdev->vm_manager.sa_manager);
 }

@@ -476,13 +476,11 @@ int radeon_vm_bo_add(struct radeon_device *rdev,
                return -EINVAL;
        }

-       mutex_lock(&vm->mutex);
+       mutex_lock(&rdev->vm_mutex);
        if (last_pfn > vm->last_pfn) {
                /* grow va space 32M by 32M */
                unsigned align = ((32 << 20) >> 12) - 1;
-               radeon_mutex_lock(&rdev->cs_mutex);
                radeon_vm_unbind_locked(rdev, vm);
-               radeon_mutex_unlock(&rdev->cs_mutex);
                vm->last_pfn = (last_pfn + align) & ~align;
        }
        head = &vm->va;
@@ -498,7 +496,7 @@ int radeon_vm_bo_add(struct radeon_device *rdev,
                                bo, (unsigned)bo_va->soffset, tmp->bo,
                                (unsigned)tmp->soffset, (unsigned)tmp->eoffset);
                        kfree(bo_va);
-                       mutex_unlock(&vm->mutex);
+                       mutex_unlock(&rdev->vm_mutex);
                        return -EINVAL;
                }
                last_offset = tmp->eoffset;
@@ -506,7 +504,7 @@ int radeon_vm_bo_add(struct radeon_device *rdev,
        }
        list_add(&bo_va->vm_list, head);
        list_add_tail(&bo_va->bo_list, &bo->va);
-       mutex_unlock(&vm->mutex);
+       mutex_unlock(&rdev->vm_mutex);
        return 0;
 }

@@ -597,13 +595,11 @@ int radeon_vm_bo_rmv(struct radeon_device *rdev,
        if (bo_va == NULL)
                return 0;

-       mutex_lock(&vm->mutex);
-       radeon_mutex_lock(&rdev->cs_mutex);
+       mutex_lock(&rdev->vm_mutex);
        radeon_vm_bo_update_pte(rdev, vm, bo, NULL);
-       radeon_mutex_unlock(&rdev->cs_mutex);
        list_del(&bo_va->vm_list);
-       mutex_unlock(&vm->mutex);
        list_del(&bo_va->bo_list);
+       mutex_unlock(&rdev->vm_mutex);

        kfree(bo_va);
        return 0;
@@ -643,11 +639,8 @@ void radeon_vm_fini(struct radeon_device *rdev, struct 
radeon_vm *vm)
        struct radeon_bo_va *bo_va, *tmp;
        int r;

-       mutex_lock(&vm->mutex);
-
-       radeon_mutex_lock(&rdev->cs_mutex);
+       mutex_lock(&rdev->vm_mutex);
        radeon_vm_unbind_locked(rdev, vm);
-       radeon_mutex_unlock(&rdev->cs_mutex);

        /* remove all bo */
        r = radeon_bo_reserve(rdev->ib_pool.sa_manager.bo, false);
@@ -670,5 +663,5 @@ void radeon_vm_fini(struct radeon_device *rdev, struct 
radeon_vm *vm)
                        kfree(bo_va);
                }
        }
-       mutex_unlock(&vm->mutex);
+       mutex_unlock(&rdev->vm_mutex);
 }
-- 
1.7.5.4


--------------030900030703060205040108--

Reply via email to