]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amdgpu: fix check in amdgpu_hmm_invalidate_gfx
authorChristian König <christian.koenig@amd.com>
Wed, 24 Jun 2026 14:00:41 +0000 (16:00 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 1 Jul 2026 17:01:05 +0000 (13:01 -0400)
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 <christian.koenig@amd.com>
Fixes: 91250893cbaa ("drm/amdgpu: fix waiting for all submissions for userptrs")
Closes: https://gitlab.freedesktop.org/drm/amd/-/work_items/5399
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 631849ff5d603841e74f19f4a5e30fe1f7d7cf30)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.c

index 76da3f932f2463c61180ecb9a816d187c6ba5417..6a0699746fbcd6f19936f4b2b99493a88291a703 100644 (file)
@@ -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);
        r = amdgpu_ttm_tt_set_userptr(&bo->tbo, args->addr, args->flags);
        if (r)
                goto release_object;
index 99bc9ad67d5b839571d8fe53d7180edca8655719..a7d13e337d8468796537f7ee68c4d41d7724cf1b 100644 (file)
@@ -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);