On Fri, Jun 26, 2026 at 2:01 PM Christian König
<[email protected]> wrote:
>
> For a short moment during alloc/free the userptr BO is not part of his VM,
> so bo->vm_bo can be NULL.
>
> Keep a reference to the VM root PD as parent of the userptr BO so that
> we can always use that to wait for all submissions of the VM instead of
> only the one involving the userptr BO.
>
> Signed-off-by: Christian König <[email protected]>
> Fixes: 5cd5f99b7b9b ("drm/amdgpu: fix waiting for all submissions for 
> userptrs")

Closes: https://gitlab.freedesktop.org/drm/amd/-/work_items/5399

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 1 +
>  drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.c | 3 +--
>  2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index 28f89ae8ca74..686be2bb8c37 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -535,6 +535,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void 
> *data,
>         bo = gem_to_amdgpu_bo(gobj);
>         bo->preferred_domains = AMDGPU_GEM_DOMAIN_GTT;
>         bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT;
> +       bo->parent = amdgpu_bo_ref(fpriv->vm.root.bo);

Do you need an unref to match this?

Alex

>         r = amdgpu_ttm_tt_set_userptr(&bo->tbo, args->addr, args->flags);
>         if (r)
>                 goto release_object;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.c
> index b38788228d0b..eaf02f90fddf 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.c
> @@ -67,7 +67,6 @@ static bool amdgpu_hmm_invalidate_gfx(struct 
> mmu_interval_notifier *mni,
>  {
>         struct amdgpu_bo *bo = container_of(mni, struct amdgpu_bo, notifier);
>         struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
> -       struct amdgpu_bo *vm_root = bo->vm_bo->vm->root.bo;
>         long r;
>
>         if (!mmu_notifier_range_blockable(range))
> @@ -78,7 +77,7 @@ static bool amdgpu_hmm_invalidate_gfx(struct 
> mmu_interval_notifier *mni,
>         mmu_interval_set_seq(mni, cur_seq);
>
>         amdgpu_vm_bo_invalidate(bo, false);
> -       r = dma_resv_wait_timeout(vm_root->tbo.base.resv,
> +       r = dma_resv_wait_timeout(bo->parent->tbo.base.resv,
>                                   DMA_RESV_USAGE_BOOKKEEP, false,
>                                   MAX_SCHEDULE_TIMEOUT);
>         mutex_unlock(&adev->notifier_lock);
> --
> 2.43.0
>

Reply via email to