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

Reply via email to