diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_vm.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_vm.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_vm.c b/drivers/gpu/drm/nouveau/nouveau_vm.c index 519a6b4bba46..244fd38fdb84 100644 --- a/drivers/gpu/drm/nouveau/nouveau_vm.c +++ b/drivers/gpu/drm/nouveau/nouveau_vm.c | |||
@@ -369,23 +369,26 @@ nouveau_vm_link(struct nouveau_vm *vm, struct nouveau_gpuobj *pgd) | |||
369 | } | 369 | } |
370 | 370 | ||
371 | static void | 371 | static void |
372 | nouveau_vm_unlink(struct nouveau_vm *vm, struct nouveau_gpuobj *pgd) | 372 | nouveau_vm_unlink(struct nouveau_vm *vm, struct nouveau_gpuobj *mpgd) |
373 | { | 373 | { |
374 | struct nouveau_vm_pgd *vpgd, *tmp; | 374 | struct nouveau_vm_pgd *vpgd, *tmp; |
375 | struct nouveau_gpuobj *pgd = NULL; | ||
375 | 376 | ||
376 | if (!pgd) | 377 | if (!mpgd) |
377 | return; | 378 | return; |
378 | 379 | ||
379 | mutex_lock(&vm->mm->mutex); | 380 | mutex_lock(&vm->mm->mutex); |
380 | list_for_each_entry_safe(vpgd, tmp, &vm->pgd_list, head) { | 381 | list_for_each_entry_safe(vpgd, tmp, &vm->pgd_list, head) { |
381 | if (vpgd->obj != pgd) | 382 | if (vpgd->obj == mpgd) { |
382 | continue; | 383 | pgd = vpgd->obj; |
383 | 384 | list_del(&vpgd->head); | |
384 | list_del(&vpgd->head); | 385 | kfree(vpgd); |
385 | nouveau_gpuobj_ref(NULL, &vpgd->obj); | 386 | break; |
386 | kfree(vpgd); | 387 | } |
387 | } | 388 | } |
388 | mutex_unlock(&vm->mm->mutex); | 389 | mutex_unlock(&vm->mm->mutex); |
390 | |||
391 | nouveau_gpuobj_ref(NULL, &pgd); | ||
389 | } | 392 | } |
390 | 393 | ||
391 | static void | 394 | static void |
@@ -396,8 +399,8 @@ nouveau_vm_del(struct nouveau_vm *vm) | |||
396 | list_for_each_entry_safe(vpgd, tmp, &vm->pgd_list, head) { | 399 | list_for_each_entry_safe(vpgd, tmp, &vm->pgd_list, head) { |
397 | nouveau_vm_unlink(vm, vpgd->obj); | 400 | nouveau_vm_unlink(vm, vpgd->obj); |
398 | } | 401 | } |
399 | WARN_ON(nouveau_mm_fini(&vm->mm) != 0); | ||
400 | 402 | ||
403 | nouveau_mm_fini(&vm->mm); | ||
401 | kfree(vm->pgt); | 404 | kfree(vm->pgt); |
402 | kfree(vm); | 405 | kfree(vm); |
403 | } | 406 | } |