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);