On Sun, Jun 3, 2012 at 10:09 AM, Christian K?nig
<deathsimple at vodafone.de> wrote:
> Locking mutex in different orders just screams for
> deadlocks, and some testing showed that it is actually
> quite easy to trigger them.
>
> Signed-off-by: Christian K?nig <deathsimple at vodafone.de>
Reviewed-by: Jerome Glisse <jglisse at redhat.com>

> Cc: stable at vger.kernel.org
> ---
> ?drivers/gpu/drm/radeon/radeon_gart.c | ? 19 ++++++++++++-------
> ?1 file changed, 12 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_gart.c 
> b/drivers/gpu/drm/radeon/radeon_gart.c
> index 79db56e..59d4493 100644
> --- a/drivers/gpu/drm/radeon/radeon_gart.c
> +++ b/drivers/gpu/drm/radeon/radeon_gart.c
> @@ -476,12 +476,18 @@ int radeon_vm_bo_add(struct radeon_device *rdev,
>
> ? ? ? ?mutex_lock(&vm->mutex);
> ? ? ? ?if (last_pfn > vm->last_pfn) {
> - ? ? ? ? ? ? ? /* grow va space 32M by 32M */
> - ? ? ? ? ? ? ? unsigned align = ((32 << 20) >> 12) - 1;
> + ? ? ? ? ? ? ? /* release mutex and lock in right order */
> + ? ? ? ? ? ? ? mutex_unlock(&vm->mutex);
> ? ? ? ? ? ? ? ?radeon_mutex_lock(&rdev->cs_mutex);
> - ? ? ? ? ? ? ? radeon_vm_unbind_locked(rdev, vm);
> + ? ? ? ? ? ? ? mutex_lock(&vm->mutex);
> + ? ? ? ? ? ? ? /* and check again */
> + ? ? ? ? ? ? ? if (last_pfn > vm->last_pfn) {
> + ? ? ? ? ? ? ? ? ? ? ? /* grow va space 32M by 32M */
> + ? ? ? ? ? ? ? ? ? ? ? unsigned align = ((32 << 20) >> 12) - 1;
> + ? ? ? ? ? ? ? ? ? ? ? radeon_vm_unbind_locked(rdev, vm);
> + ? ? ? ? ? ? ? ? ? ? ? vm->last_pfn = (last_pfn + align) & ~align;
> + ? ? ? ? ? ? ? }
> ? ? ? ? ? ? ? ?radeon_mutex_unlock(&rdev->cs_mutex);
> - ? ? ? ? ? ? ? vm->last_pfn = (last_pfn + align) & ~align;
> ? ? ? ?}
> ? ? ? ?head = &vm->va;
> ? ? ? ?last_offset = 0;
> @@ -595,8 +601,8 @@ 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(&vm->mutex);
> ? ? ? ?radeon_vm_bo_update_pte(rdev, vm, bo, NULL);
> ? ? ? ?radeon_mutex_unlock(&rdev->cs_mutex);
> ? ? ? ?list_del(&bo_va->vm_list);
> @@ -641,9 +647,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(&vm->mutex);
> ? ? ? ?radeon_vm_unbind_locked(rdev, vm);
> ? ? ? ?radeon_mutex_unlock(&rdev->cs_mutex);
>
> --
> 1.7.9.5
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to