On 6/26/26 21:31, Alex Deucher wrote:
> 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?
That's in amdgpu_bo_destroy(), we use bo->parent for multiple other things
already.
Christian.
>
> 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
>>