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