diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index 087332858853..00c5b580f56c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | |||
@@ -483,6 +483,9 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, | |||
483 | if (domain == AMDGPU_GEM_DOMAIN_CPU) | 483 | if (domain == AMDGPU_GEM_DOMAIN_CPU) |
484 | goto error_unreserve; | 484 | goto error_unreserve; |
485 | } | 485 | } |
486 | r = amdgpu_vm_update_page_directory(adev, bo_va->vm); | ||
487 | if (r) | ||
488 | goto error_unreserve; | ||
486 | 489 | ||
487 | r = amdgpu_vm_clear_freed(adev, bo_va->vm); | 490 | r = amdgpu_vm_clear_freed(adev, bo_va->vm); |
488 | if (r) | 491 | if (r) |
@@ -512,6 +515,9 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data, | |||
512 | struct amdgpu_fpriv *fpriv = filp->driver_priv; | 515 | struct amdgpu_fpriv *fpriv = filp->driver_priv; |
513 | struct amdgpu_bo *rbo; | 516 | struct amdgpu_bo *rbo; |
514 | struct amdgpu_bo_va *bo_va; | 517 | struct amdgpu_bo_va *bo_va; |
518 | struct ttm_validate_buffer tv, tv_pd; | ||
519 | struct ww_acquire_ctx ticket; | ||
520 | struct list_head list, duplicates; | ||
515 | uint32_t invalid_flags, va_flags = 0; | 521 | uint32_t invalid_flags, va_flags = 0; |
516 | int r = 0; | 522 | int r = 0; |
517 | 523 | ||
@@ -549,7 +555,18 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data, | |||
549 | return -ENOENT; | 555 | return -ENOENT; |
550 | mutex_lock(&fpriv->vm.mutex); | 556 | mutex_lock(&fpriv->vm.mutex); |
551 | rbo = gem_to_amdgpu_bo(gobj); | 557 | rbo = gem_to_amdgpu_bo(gobj); |
552 | r = amdgpu_bo_reserve(rbo, false); | 558 | INIT_LIST_HEAD(&list); |
559 | INIT_LIST_HEAD(&duplicates); | ||
560 | tv.bo = &rbo->tbo; | ||
561 | tv.shared = true; | ||
562 | list_add(&tv.head, &list); | ||
563 | |||
564 | if (args->operation == AMDGPU_VA_OP_MAP) { | ||
565 | tv_pd.bo = &fpriv->vm.page_directory->tbo; | ||
566 | tv_pd.shared = true; | ||
567 | list_add(&tv_pd.head, &list); | ||
568 | } | ||
569 | r = ttm_eu_reserve_buffers(&ticket, &list, true, &duplicates); | ||
553 | if (r) { | 570 | if (r) { |
554 | mutex_unlock(&fpriv->vm.mutex); | 571 | mutex_unlock(&fpriv->vm.mutex); |
555 | drm_gem_object_unreference_unlocked(gobj); | 572 | drm_gem_object_unreference_unlocked(gobj); |
@@ -558,7 +575,8 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data, | |||
558 | 575 | ||
559 | bo_va = amdgpu_vm_bo_find(&fpriv->vm, rbo); | 576 | bo_va = amdgpu_vm_bo_find(&fpriv->vm, rbo); |
560 | if (!bo_va) { | 577 | if (!bo_va) { |
561 | amdgpu_bo_unreserve(rbo); | 578 | ttm_eu_backoff_reservation(&ticket, &list); |
579 | drm_gem_object_unreference_unlocked(gobj); | ||
562 | mutex_unlock(&fpriv->vm.mutex); | 580 | mutex_unlock(&fpriv->vm.mutex); |
563 | return -ENOENT; | 581 | return -ENOENT; |
564 | } | 582 | } |
@@ -581,7 +599,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data, | |||
581 | default: | 599 | default: |
582 | break; | 600 | break; |
583 | } | 601 | } |
584 | 602 | ttm_eu_backoff_reservation(&ticket, &list); | |
585 | if (!r && !(args->flags & AMDGPU_VM_DELAY_UPDATE)) | 603 | if (!r && !(args->flags & AMDGPU_VM_DELAY_UPDATE)) |
586 | amdgpu_gem_va_update_vm(adev, bo_va, args->operation); | 604 | amdgpu_gem_va_update_vm(adev, bo_va, args->operation); |
587 | mutex_unlock(&fpriv->vm.mutex); | 605 | mutex_unlock(&fpriv->vm.mutex); |