On Sun, Jun 3, 2012 at 10:09 AM, Christian König <deathsim...@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 <deathsim...@vodafone.de> Reviewed-by: Jerome Glisse <jgli...@redhat.com>
> Cc: sta...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel