OSDN Git Service

drm/nouveau: shut lockdep up if last vm ref needs to destroy pgd
authorBen Skeggs <bskeggs@redhat.com>
Wed, 8 Jun 2011 08:40:34 +0000 (18:40 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 23 Jun 2011 06:01:52 +0000 (16:01 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_vm.c

index 75ef595..244fd38 100644 (file)
@@ -369,23 +369,26 @@ nouveau_vm_link(struct nouveau_vm *vm, struct nouveau_gpuobj *pgd)
 }
 
 static void
-nouveau_vm_unlink(struct nouveau_vm *vm, struct nouveau_gpuobj *pgd)
+nouveau_vm_unlink(struct nouveau_vm *vm, struct nouveau_gpuobj *mpgd)
 {
        struct nouveau_vm_pgd *vpgd, *tmp;
+       struct nouveau_gpuobj *pgd = NULL;
 
-       if (!pgd)
+       if (!mpgd)
                return;
 
        mutex_lock(&vm->mm->mutex);
        list_for_each_entry_safe(vpgd, tmp, &vm->pgd_list, head) {
-               if (vpgd->obj != pgd)
-                       continue;
-
-               list_del(&vpgd->head);
-               nouveau_gpuobj_ref(NULL, &vpgd->obj);
-               kfree(vpgd);
+               if (vpgd->obj == mpgd) {
+                       pgd = vpgd->obj;
+                       list_del(&vpgd->head);
+                       kfree(vpgd);
+                       break;
+               }
        }
        mutex_unlock(&vm->mm->mutex);
+
+       nouveau_gpuobj_ref(NULL, &pgd);
 }
 
 static void