From: "Christian König" <christian.koenig@amd.com>
To: "Jesse.Zhang" <Jesse.Zhang@amd.com>, amd-gfx@lists.freedesktop.org
Cc: Alexander.Deucher@amd.com
Subject: Re: [v2] drm/amdgpu: Merge amdgpu_vm_set_pasid into amdgpu_vm_init
Date: Fri, 26 Sep 2025 10:50:37 +0200 [thread overview]
Message-ID: <6bd2ec1d-2fc2-4e49-abb3-4bf7782c29f5@amd.com> (raw)
In-Reply-To: <20250926080348.2935967-1-Jesse.Zhang@amd.com>
On 26.09.25 09:58, Jesse.Zhang wrote:
> As KFD no longer uses a separate PASID, the global amdgpu_vm_set_pasid()function is no longer necessary.
> Merge its functionality directly intoamdgpu_vm_init() to simplify code flow and eliminate redundant locking.
>
> v2: remove superflous check
> adjust amdgpu_vm_fin and remove amdgpu_vm_set_pasid (Chritian)
>
> Suggested-by: Christian König <christian.koenig@amd.com>
> Signed-off-by: Jesse Zhang <Jesse.Zhang@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 10 +---
> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 66 +++++++++----------------
> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 5 +-
> 3 files changed, 25 insertions(+), 56 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> index 8676400834fc..a9327472c651 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> @@ -1421,14 +1421,10 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
>
> amdgpu_debugfs_vm_init(file_priv);
>
> - r = amdgpu_vm_init(adev, &fpriv->vm, fpriv->xcp_id);
> + r = amdgpu_vm_init(adev, &fpriv->vm, fpriv->xcp_id, pasid);
> if (r)
> goto error_pasid;
>
> - r = amdgpu_vm_set_pasid(adev, &fpriv->vm, pasid);
> - if (r)
> - goto error_vm;
> -
> fpriv->prt_va = amdgpu_vm_bo_add(adev, &fpriv->vm, NULL);
> if (!fpriv->prt_va) {
> r = -ENOMEM;
> @@ -1468,10 +1464,8 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
> amdgpu_vm_fini(adev, &fpriv->vm);
>
> error_pasid:
> - if (pasid) {
> + if (pasid)
> amdgpu_pasid_free(pasid);
> - amdgpu_vm_set_pasid(adev, &fpriv->vm, 0);
> - }
>
> kfree(fpriv);
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 108d2a838ef0..f78fce37b5a4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -138,48 +138,6 @@ static void amdgpu_vm_assert_locked(struct amdgpu_vm *vm)
> dma_resv_assert_held(vm->root.bo->tbo.base.resv);
> }
>
> -/**
> - * amdgpu_vm_set_pasid - manage pasid and vm ptr mapping
> - *
> - * @adev: amdgpu_device pointer
> - * @vm: amdgpu_vm pointer
> - * @pasid: the pasid the VM is using on this GPU
> - *
> - * Set the pasid this VM is using on this GPU, can also be used to remove the
> - * pasid by passing in zero.
> - *
> - */
> -int amdgpu_vm_set_pasid(struct amdgpu_device *adev, struct amdgpu_vm *vm,
> - u32 pasid)
> -{
> - int r;
> -
> - amdgpu_vm_assert_locked(vm);
> -
> - if (vm->pasid == pasid)
> - return 0;
> -
> - if (vm->pasid) {
> - r = xa_err(xa_erase_irq(&adev->vm_manager.pasids, vm->pasid));
> - if (r < 0)
> - return r;
> -
> - vm->pasid = 0;
> - }
> -
> - if (pasid) {
> - r = xa_err(xa_store_irq(&adev->vm_manager.pasids, pasid, vm,
> - GFP_KERNEL));
> - if (r < 0)
> - return r;
> -
> - vm->pasid = pasid;
> - }
> -
> -
> - return 0;
> -}
> -
> /**
> * amdgpu_vm_bo_evicted - vm_bo is evicted
> *
> @@ -2552,6 +2510,7 @@ void amdgpu_vm_set_task_info(struct amdgpu_vm *vm)
> * @adev: amdgpu_device pointer
> * @vm: requested vm
> * @xcp_id: GPU partition selection id
> + * @pasid: the pasid the VM is using on this GPU
> *
> * Init @vm fields.
> *
> @@ -2559,7 +2518,7 @@ void amdgpu_vm_set_task_info(struct amdgpu_vm *vm)
> * 0 for success, error for failure.
> */
> int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
> - int32_t xcp_id)
> + int32_t xcp_id, uint32_t pasid)
> {
> struct amdgpu_bo *root_bo;
> struct amdgpu_bo_vm *root;
> @@ -2636,12 +2595,26 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
> if (r)
> dev_dbg(adev->dev, "Failed to create task info for VM\n");
>
> + /* Store new PASID in XArray (if non-zero) */
> + if (pasid != 0) {
> + r = xa_err(xa_store_irq(&adev->vm_manager.pasids, pasid, vm, GFP_KERNEL));
> + if (r < 0)
> + goto error_free_root;
> +
> + vm->pasid = pasid;
> + }
> +
> amdgpu_bo_unreserve(vm->root.bo);
> amdgpu_bo_unref(&root_bo);
>
> return 0;
>
> error_free_root:
> + /* If PASID was partially set, erase it from XArray before failing */
> + if (vm->pasid != 0) {
> + xa_erase_irq(&adev->vm_manager.pasids, vm->pasid);
> + vm->pasid = 0;
> + }
> amdgpu_vm_pt_free_root(adev, vm);
> amdgpu_bo_unreserve(vm->root.bo);
> amdgpu_bo_unref(&root_bo);
> @@ -2747,7 +2720,12 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
>
> root = amdgpu_bo_ref(vm->root.bo);
> amdgpu_bo_reserve(root, true);
> - amdgpu_vm_set_pasid(adev, vm, 0);
> + /* Remove PASID mapping before destroying VM */
> + if (vm->pasid != 0) {
> + amdgpu_vm_assert_locked(vm);
This here should be dropped. We lock the VM root PD, but only to make sure that TTM doesn't destroys it before we have waited for the fences below.
With that done Reviewed-by: Christian König <christian.koenig@amd.com>.
Regards,
Christian.
> + xa_erase_irq(&adev->vm_manager.pasids, vm->pasid);
> + vm->pasid = 0;
> + }
> dma_fence_wait(vm->last_unlocked, false);
> dma_fence_put(vm->last_unlocked);
> dma_fence_wait(vm->last_tlb_flush, false);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> index 3b9d583358b0..556d0483c6bc 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> @@ -503,11 +503,8 @@ extern const struct amdgpu_vm_update_funcs amdgpu_vm_sdma_funcs;
> void amdgpu_vm_manager_init(struct amdgpu_device *adev);
> void amdgpu_vm_manager_fini(struct amdgpu_device *adev);
>
> -int amdgpu_vm_set_pasid(struct amdgpu_device *adev, struct amdgpu_vm *vm,
> - u32 pasid);
> -
> long amdgpu_vm_wait_idle(struct amdgpu_vm *vm, long timeout);
> -int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, int32_t xcp_id);
> +int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, int32_t xcp_id, uint32_t 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);
> int amdgpu_vm_lock_pd(struct amdgpu_vm *vm, struct drm_exec *exec,
prev parent reply other threads:[~2025-09-26 8:50 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-26 7:58 [v2] drm/amdgpu: Merge amdgpu_vm_set_pasid into amdgpu_vm_init Jesse.Zhang
2025-09-26 8:50 ` Christian König [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6bd2ec1d-2fc2-4e49-abb3-4bf7782c29f5@amd.com \
--to=christian.koenig@amd.com \
--cc=Alexander.Deucher@amd.com \
--cc=Jesse.Zhang@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox