]> Git Repo - linux.git/commitdiff
drm/amdkfd: Update MTYPE for far memory partition
authorPhilip Yang <[email protected]>
Thu, 2 Feb 2023 16:07:53 +0000 (11:07 -0500)
committerAlex Deucher <[email protected]>
Fri, 9 Jun 2023 14:36:30 +0000 (10:36 -0400)
Use MTYPE RW/MTYPE_CC for mapping system memory or VRAM to KFD node
within the same memory partition, use MTYPE_NC for mapping on KFD node
from the far memory partition of the same socket or from another socket
on same XGMI hive.

On NPS4 or 4P system, MTYPE will be overridden per page depending on
the memory NUMA node id and vm->mem_id.

Signed-off-by: Philip Yang <[email protected]>
Reviewed-by: Felix Kuehling <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
drivers/gpu/drm/amd/amdkfd/kfd_svm.c

index 32eb4f4f549229645aaeeeaee688a99c0221f8f0..263d17a8b43345c6cd62eee80e4a2cb4356e48db 100644 (file)
@@ -1186,7 +1186,7 @@ static void gmc_v9_0_get_coherence_flags(struct amdgpu_device *adev,
        bool is_vram = bo->tbo.resource->mem_type == TTM_PL_VRAM;
        bool coherent = bo->flags & AMDGPU_GEM_CREATE_COHERENT;
        bool uncached = bo->flags & AMDGPU_GEM_CREATE_UNCACHED;
-       /* TODO: memory partitions struct amdgpu_vm *vm = mapping->bo_va->base.vm;*/
+       struct amdgpu_vm *vm = mapping->bo_va->base.vm;
        unsigned int mtype_local, mtype;
        bool snoop = false;
        bool is_local;
@@ -1247,8 +1247,8 @@ static void gmc_v9_0_get_coherence_flags(struct amdgpu_device *adev,
                }
                is_local = (!is_vram && (adev->flags & AMD_IS_APU) &&
                            num_possible_nodes() <= 1) ||
-                          (is_vram && adev == bo_adev /* TODO: memory partitions &&
-                           bo->mem_id == vm->mem_id*/);
+                          (is_vram && adev == bo_adev &&
+                           bo->mem_id == vm->mem_id);
                snoop = true;
                if (uncached) {
                        mtype = MTYPE_UC;
@@ -1335,13 +1335,12 @@ static void gmc_v9_0_override_vm_pte_flags(struct amdgpu_device *adev,
                return;
        }
 
-       /* TODO: memory partitions. mem_id is hard-coded to 0 for now.
-        * FIXME: Only supported on native mode for now. For carve-out, the
+       /* FIXME: Only supported on native mode for now. For carve-out, the
         * NUMA affinity of the GPU/VM needs to come from the PCI info because
         * memory partitions are not associated with different NUMA nodes.
         */
-       if (adev->gmc.is_app_apu) {
-               local_node = adev->gmc.mem_partitions[/*vm->mem_id*/0].numa.node;
+       if (adev->gmc.is_app_apu && vm->mem_id >= 0) {
+               local_node = adev->gmc.mem_partitions[vm->mem_id].numa.node;
        } else {
                dev_dbg(adev->dev, "Only native mode APU is supported.\n");
                return;
@@ -1356,7 +1355,7 @@ static void gmc_v9_0_override_vm_pte_flags(struct amdgpu_device *adev,
        }
        nid = pfn_to_nid(addr >> PAGE_SHIFT);
        dev_dbg(adev->dev, "vm->mem_id=%d, local_node=%d, nid=%d\n",
-               /*vm->mem_id*/0, local_node, nid);
+               vm->mem_id, local_node, nid);
        if (nid == local_node) {
                uint64_t old_flags = *flags;
                unsigned int mtype_local = MTYPE_RW;
index 62aa7fb2eaa54dbb1282fbe684c11b21d03e7ba7..a700d9ccd05481a57c4994e998cf4a43ad6ff949 100644 (file)
@@ -1203,8 +1203,8 @@ svm_range_get_pte_flags(struct kfd_node *node,
                        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 /* TODO: memory partitions &&
-                           bo_node->mem_id == node->mem_id*/)
+                       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))
@@ -1358,8 +1358,9 @@ svm_range_map_to_gpu(struct kfd_process_device *pdd, struct svm_range *prange,
                         (last_domain == SVM_RANGE_VRAM_DOMAIN) ? 1 : 0,
                         pte_flags);
 
-               /* TODO: we still need to determine the vm_manager.vram_base_offset based on
-                * the memory partition.
+               /* For dGPU mode, we use same vm_manager to allocate VRAM for
+                * different memory partition based on fpfn/lpfn, we should use
+                * same vm_manager.vram_base_offset regardless memory partition.
                 */
                r = amdgpu_vm_update_range(adev, vm, false, false, flush_tlb, NULL,
                                           last_start, prange->start + i,
This page took 0.077682 seconds and 4 git commands to generate.