[PATCH 04/21] drm/amdgpu: always allocate a pasid for each VM

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 2018å¹´01æ??10æ?¥ 20:54, Christian König wrote:
> Start to always allocate a pasid for each VM.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 43 ++++++++++++++++++++++-----------
>   1 file changed, 29 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> index 5773a581761b..60e0f2dd87df 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> @@ -805,7 +805,7 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
>   {
>   	struct amdgpu_device *adev = dev->dev_private;
>   	struct amdgpu_fpriv *fpriv;
> -	int r;
> +	int r, pasid;
>   
>   	file_priv->driver_priv = NULL;
>   
> @@ -819,28 +819,25 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
>   		goto out_suspend;
>   	}
>   
> -	r = amdgpu_vm_init(adev, &fpriv->vm,
> -			   AMDGPU_VM_CONTEXT_GFX, 0);
> -	if (r) {
> -		kfree(fpriv);
> -		goto out_suspend;
> +	pasid = amdgpu_pasid_alloc(16);
> +	if (pasid < 0) {
> +		dev_info(adev->dev, "No more PASIDs available!");
A WARN_ON seems be more appropriate, since the following patches relies 
on vm->pasid.

Regards,
David Zhou
> +		pasid = 0;
>   	}
> +	r = amdgpu_vm_init(adev, &fpriv->vm, AMDGPU_VM_CONTEXT_GFX, pasid);
> +	if (r)
> +		goto error_pasid;
>   
>   	fpriv->prt_va = amdgpu_vm_bo_add(adev, &fpriv->vm, NULL);
>   	if (!fpriv->prt_va) {
>   		r = -ENOMEM;
> -		amdgpu_vm_fini(adev, &fpriv->vm);
> -		kfree(fpriv);
> -		goto out_suspend;
> +		goto error_vm;
>   	}
>   
>   	if (amdgpu_sriov_vf(adev)) {
>   		r = amdgpu_map_static_csa(adev, &fpriv->vm, &fpriv->csa_va);
> -		if (r) {
> -			amdgpu_vm_fini(adev, &fpriv->vm);
> -			kfree(fpriv);
> -			goto out_suspend;
> -		}
> +		if (r)
> +			goto error_vm;
>   	}
>   
>   	mutex_init(&fpriv->bo_list_lock);
> @@ -849,6 +846,16 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
>   	amdgpu_ctx_mgr_init(&fpriv->ctx_mgr);
>   
>   	file_priv->driver_priv = fpriv;
> +	goto out_suspend;
> +
> +error_vm:
> +	amdgpu_vm_fini(adev, &fpriv->vm);
> +
> +error_pasid:
> +	if (pasid)
> +		amdgpu_pasid_free(pasid);
> +
> +	kfree(fpriv);
>   
>   out_suspend:
>   	pm_runtime_mark_last_busy(dev->dev);
> @@ -871,6 +878,8 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
>   	struct amdgpu_device *adev = dev->dev_private;
>   	struct amdgpu_fpriv *fpriv = file_priv->driver_priv;
>   	struct amdgpu_bo_list *list;
> +	struct amdgpu_bo *pd;
> +	unsigned int pasid;
>   	int handle;
>   
>   	if (!fpriv)
> @@ -895,7 +904,13 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
>   		amdgpu_bo_unreserve(adev->virt.csa_obj);
>   	}
>   
> +	pasid = fpriv->vm.pasid;
> +	pd = amdgpu_bo_ref(fpriv->vm.root.base.bo);
> +
>   	amdgpu_vm_fini(adev, &fpriv->vm);
> +	if (pasid)
> +		amdgpu_pasid_free_delayed(pd->tbo.resv, pasid);
> +	amdgpu_bo_unref(&pd);
>   
>   	idr_for_each_entry(&fpriv->bo_list_handles, list, handle)
>   		amdgpu_bo_list_free(list);



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux