[PATCH 03/14] drm/amdgpu: Add helper to turn an existing VM into a compute VM
Christian König
ckoenig.leichtzumerken at gmail.com
Mon Mar 5 12:17:23 UTC 2018
Am 04.03.2018 um 03:34 schrieb Felix Kuehling:
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 82 ++++++++++++++++++++++++++++++++++
> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 1 +
> 2 files changed, 83 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 5afbc5e..58153ef 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -2350,6 +2350,8 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
> INIT_KFIFO(vm->faults);
> vm->fault_credit = 16;
>
> + vm->vm_context = vm_context;
I think we should drop the vm_context parameter and all the related code
in amdgpu_vm_init(). But that can be part of a later cleanup patch as well.
> +
> return 0;
>
> error_free_root:
> @@ -2364,6 +2366,86 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
> }
>
> /**
> + * amdgpu_vm_make_compute - Turn a GFX VM into a compute VM
> + *
> + * This only works on GFX VMs that don't have any BOs added and no
> + * page tables allocated yet.
> + *
> + * Changes the following VM parameters:
> + * - vm_context
> + * - use_cpu_for_update
> + * - pte_supports_ats
> + * - pasid (old PASID is released, because compute manages its own PASIDs)
> + *
> + * Reinitializes the page directory to reflect the changed ATS
> + * setting. May leave behind an unused shadow BO for the page
> + * directory when switching from SDMA updates to CPU updates.
> + *
> + * Returns 0 for success, -errno for errors.
> + */
> +int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)
> +{
> + bool pte_support_ats = (adev->asic_type == CHIP_RAVEN);
> + int r;
> +
> + r = amdgpu_bo_reserve(vm->root.base.bo, true);
> + if (r)
> + return r;
> +
> + /* Sanity checks */
> + if (vm->vm_context == AMDGPU_VM_CONTEXT_COMPUTE) {
> + /* Can happen if ioctl is interrupted by a signal after
> + * this function already completed. Just return success.
> + */
> + r = 0;
> + goto error;
> + }
Ok, that is actually a show stopper. An interrupted IOCTL should never
have a visible effect.
Is that just a theoretical issue or did you run into this in practice?
Regards,
Christian.
> + if (!RB_EMPTY_ROOT(&vm->va.rb_root) || vm->root.entries) {
> + r = -EINVAL;
> + goto error;
> + }
> +
> + /* Check if PD needs to be reinitialized and do it before
> + * changing any other state, in case it fails.
> + */
> + if (pte_support_ats != vm->pte_support_ats) {
> + /* TODO: This depends on a patch series by Christian.
> + * It's only needed for GFX9 GPUs, which aren't
> + * supported by upstream KFD yet.
> + r = amdgpu_vm_clear_bo(adev, vm, vm->root.base.bo,
> + adev->vm_manager.root_level,
> + pte_support_ats);
> + if (r)
> + goto error;
> + */
> + }
> +
> + /* Update VM state */
> + vm->vm_context = AMDGPU_VM_CONTEXT_COMPUTE;
> + vm->use_cpu_for_update = !!(adev->vm_manager.vm_update_mode &
> + AMDGPU_VM_USE_CPU_FOR_COMPUTE);
> + vm->pte_support_ats = pte_support_ats;
> + DRM_DEBUG_DRIVER("VM update mode is %s\n",
> + vm->use_cpu_for_update ? "CPU" : "SDMA");
> + WARN_ONCE((vm->use_cpu_for_update & !amdgpu_vm_is_large_bar(adev)),
> + "CPU update of VM recommended only for large BAR system\n");
> +
> + if (vm->pasid) {
> + unsigned long flags;
> +
> + spin_lock_irqsave(&adev->vm_manager.pasid_lock, flags);
> + idr_remove(&adev->vm_manager.pasid_idr, vm->pasid);
> + spin_unlock_irqrestore(&adev->vm_manager.pasid_lock, flags);
> +
> + vm->pasid = 0;
> + }
> +
> +error:
> + amdgpu_bo_unreserve(vm->root.base.bo);
> + return r;
> +}
> +
> +/**
> * amdgpu_vm_free_levels - free PD/PT levels
> *
> * @adev: amdgpu device structure
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> index 40b4e09..7f50a38 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> @@ -263,6 +263,7 @@ void amdgpu_vm_manager_init(struct amdgpu_device *adev);
> void amdgpu_vm_manager_fini(struct amdgpu_device *adev);
> int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
> int vm_context, unsigned int pasid);
> +int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm);
> void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm);
> bool amdgpu_vm_pasid_fault_credit(struct amdgpu_device *adev,
> unsigned int pasid);
More information about the amd-gfx
mailing list