drm/amdkfd: Fix EXT_COHERENT memory allocation crash
authorPhilip Yang <Philip.Yang@amd.com>
Tue, 3 Oct 2023 15:37:40 +0000 (11:37 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 4 Oct 2023 22:40:30 +0000 (18:40 -0400)
If there is no VRAM domain, bo_node is NULL and this causes crash.
Refactor the change, and use the module parameter as higher privilege.

Need another patch to support override PTE flag on APU.

Fixes: 5f248462c69d ("drm/amdgpu: Add EXT_COHERENT memory allocation flags")
Signed-off-by: Philip Yang <Philip.Yang@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_svm.c

index 1d5f91678fa99a1869568b3fb07e05ebecf565f7..760e1acfa28e5079b9e0a2a56322729203598c84 100644 (file)
@@ -1250,26 +1250,22 @@ svm_range_get_pte_flags(struct kfd_node *node,
                break;
        case IP_VERSION(9, 4, 3):
                mtype_local = amdgpu_mtype_local == 1 ? AMDGPU_VM_MTYPE_NC :
-                            (amdgpu_mtype_local == 2 ? AMDGPU_VM_MTYPE_CC : AMDGPU_VM_MTYPE_RW);
+                             (amdgpu_mtype_local == 2 || ext_coherent ?
+                                       AMDGPU_VM_MTYPE_CC : AMDGPU_VM_MTYPE_RW);
                snoop = true;
                if (uncached) {
                        mapping_flags |= AMDGPU_VM_MTYPE_UC;
-               } else if (ext_coherent) {
-                       /* local HBM region close to partition */
-                       if (bo_node->adev == node->adev &&
-                           (!bo_node->xcp || !node->xcp || bo_node->xcp->mem_id == node->xcp->mem_id))
-                               mapping_flags |= AMDGPU_VM_MTYPE_CC;
-                       else
-                               mapping_flags |= AMDGPU_VM_MTYPE_UC;
                } else if (domain == SVM_RANGE_VRAM_DOMAIN) {
                        /* local HBM region close to partition */
                        if (bo_node->adev == node->adev &&
                            (!bo_node->xcp || !node->xcp || bo_node->xcp->mem_id == node->xcp->mem_id))
                                mapping_flags |= mtype_local;
-                       /* local HBM region far from partition or remote XGMI GPU */
-                       else if (svm_nodes_in_same_hive(bo_node, node))
+                       /* local HBM region far from partition or remote XGMI GPU
+                        * with regular system scope coherence
+                        */
+                       else if (svm_nodes_in_same_hive(bo_node, node) && !ext_coherent)
                                mapping_flags |= AMDGPU_VM_MTYPE_NC;
-                       /* PCIe P2P */
+                       /* PCIe P2P or extended system scope coherence */
                        else
                                mapping_flags |= AMDGPU_VM_MTYPE_UC;
                /* system memory accessed by the APU */