]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amdgpu: fix check in gmc_v9_0_get_vm_pte()
authorChristian König <christian.koenig@amd.com>
Thu, 31 Oct 2024 09:04:17 +0000 (10:04 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 11 Nov 2024 19:05:44 +0000 (14:05 -0500)
The coherency flags can only be determined when the BO is locked and that
in turn is only guaranteed when the mapping is validated.

Fix the check, move the resource check into the function and add an assert
that the BO is locked.

Signed-off-by: Christian König <christian.koenig@amd.com>
Fixes: d1a372af1c3d ("drm/amdgpu: Set MTYPE in PTE based on BO flags")
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 1b4ca8546f5b5c482717bedb8e031227b1541539)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c

index c76ac0dfe572d0e8ec688a41f06a55ac9e8c011f..7a45f3fdc73410c8a3c2ef84a6d759dc82a3e13c 100644 (file)
@@ -1124,8 +1124,10 @@ static void gmc_v9_0_get_coherence_flags(struct amdgpu_device *adev,
                                         uint64_t *flags)
 {
        struct amdgpu_device *bo_adev = amdgpu_ttm_adev(bo->tbo.bdev);
-       bool is_vram = bo->tbo.resource->mem_type == TTM_PL_VRAM;
-       bool coherent = bo->flags & (AMDGPU_GEM_CREATE_COHERENT | AMDGPU_GEM_CREATE_EXT_COHERENT);
+       bool is_vram = bo->tbo.resource &&
+               bo->tbo.resource->mem_type == TTM_PL_VRAM;
+       bool coherent = bo->flags & (AMDGPU_GEM_CREATE_COHERENT |
+                                    AMDGPU_GEM_CREATE_EXT_COHERENT);
        bool ext_coherent = bo->flags & AMDGPU_GEM_CREATE_EXT_COHERENT;
        bool uncached = bo->flags & AMDGPU_GEM_CREATE_UNCACHED;
        struct amdgpu_vm *vm = mapping->bo_va->base.vm;
@@ -1133,6 +1135,8 @@ static void gmc_v9_0_get_coherence_flags(struct amdgpu_device *adev,
        bool snoop = false;
        bool is_local;
 
+       dma_resv_assert_held(bo->tbo.base.resv);
+
        switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {
        case IP_VERSION(9, 4, 1):
        case IP_VERSION(9, 4, 2):
@@ -1251,9 +1255,8 @@ static void gmc_v9_0_get_vm_pte(struct amdgpu_device *adev,
                *flags &= ~AMDGPU_PTE_VALID;
        }
 
-       if (bo && bo->tbo.resource)
-               gmc_v9_0_get_coherence_flags(adev, mapping->bo_va->base.bo,
-                                            mapping, flags);
+       if ((*flags & AMDGPU_PTE_VALID) && bo)
+               gmc_v9_0_get_coherence_flags(adev, bo, mapping, flags);
 }
 
 static void gmc_v9_0_override_vm_pte_flags(struct amdgpu_device *adev,