]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/amdkfd: Move pgmap to amdgpu_kfd_dev structure
authorPhilip Yang <Philip.Yang@amd.com>
Fri, 31 Mar 2023 15:13:40 +0000 (11:13 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jun 2023 13:58:45 +0000 (09:58 -0400)
VRAM pgmap resource is allocated every time when switching compute
partitions because kfd_dev is re-initialized by post_partition_switch,
As a result, it causes memory region resource leaking and system
memory usage accounting unbalanced.

pgmap resource should be allocated and registered only once when loading
driver and freed when unloading driver, move it from kfd_dev to
amdgpu_kfd_dev.

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/amdgpu/amdgpu_amdkfd.h
drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
drivers/gpu/drm/amd/amdkfd/kfd_priv.h
drivers/gpu/drm/amd/amdkfd/kfd_svm.c
drivers/gpu/drm/amd/amdkfd/kfd_svm.h
drivers/gpu/drm/amd/amdkfd/kfd_topology.c

index d1d643a050a1d6f2e9cfd10097290dc0668493ea..e4e1dbba060aa019e05228498e3cdcca971855cb 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/kthread.h>
 #include <linux/workqueue.h>
 #include <linux/mmu_notifier.h>
+#include <linux/memremap.h>
 #include <kgd_kfd_interface.h>
 #include <drm/ttm/ttm_execbuf_util.h>
 #include "amdgpu_sync.h"
@@ -101,6 +102,9 @@ struct amdgpu_kfd_dev {
        uint64_t vram_used_aligned;
        bool init_complete;
        struct work_struct reset_work;
+
+       /* HMM page migration MEMORY_DEVICE_PRIVATE mapping */
+       struct dev_pagemap pgmap;
 };
 
 enum kgd_engine_type {
index 42e599912e52b5f898f1b7c2b8d5999728366795..199d32c7c289f288c0e9b8c5bf02d83bf6bfa3fc 100644 (file)
@@ -206,7 +206,7 @@ svm_migrate_copy_done(struct amdgpu_device *adev, struct dma_fence *mfence)
 unsigned long
 svm_migrate_addr_to_pfn(struct amdgpu_device *adev, unsigned long addr)
 {
-       return (addr + adev->kfd.dev->pgmap.range.start) >> PAGE_SHIFT;
+       return (addr + adev->kfd.pgmap.range.start) >> PAGE_SHIFT;
 }
 
 static void
@@ -236,7 +236,7 @@ svm_migrate_addr(struct amdgpu_device *adev, struct page *page)
        unsigned long addr;
 
        addr = page_to_pfn(page) << PAGE_SHIFT;
-       return (addr - adev->kfd.dev->pgmap.range.start);
+       return (addr - adev->kfd.pgmap.range.start);
 }
 
 static struct page *
@@ -990,14 +990,14 @@ static const struct dev_pagemap_ops svm_migrate_pgmap_ops = {
 
 int svm_migrate_init(struct amdgpu_device *adev)
 {
-       struct kfd_dev *kfddev = adev->kfd.dev;
+       struct amdgpu_kfd_dev *kfddev = &adev->kfd;
        struct dev_pagemap *pgmap;
        struct resource *res = NULL;
        unsigned long size;
        void *r;
 
        /* Page migration works on Vega10 or newer */
-       if (!KFD_IS_SOC15(kfddev))
+       if (!KFD_IS_SOC15(kfddev->dev))
                return -EINVAL;
 
        pgmap = &kfddev->pgmap;
index 02a90fd7f646b87e532f1035ccf80e05b5ab0541..214d950f948eea862363434538b4c0f2a8dc05a5 100644 (file)
@@ -378,9 +378,6 @@ struct kfd_dev {
 
        int noretry;
 
-       /* HMM page migration MEMORY_DEVICE_PRIVATE mapping */
-       struct dev_pagemap pgmap;
-
        struct kfd_node *nodes[MAX_KFD_NODES];
        unsigned int num_nodes;
 };
index cf354f9e4285644212df2deb3bdaa3ebb72062e6..2b2129dd1e4a6b90ace1adf46a45e4230b85c957 100644 (file)
@@ -174,7 +174,7 @@ svm_range_dma_map_dev(struct amdgpu_device *adev, struct svm_range *prange,
 
                        addr[i] = (hmm_pfns[i] << PAGE_SHIFT) +
                                   bo_adev->vm_manager.vram_base_offset -
-                                  bo_adev->kfd.dev->pgmap.range.start;
+                                  bo_adev->kfd.pgmap.range.start;
                        addr[i] |= SVM_RANGE_VRAM_DOMAIN;
                        pr_debug_ratelimited("vram address: 0x%llx\n", addr[i]);
                        continue;
@@ -2827,7 +2827,7 @@ svm_range_restore_pages(struct amdgpu_device *adev, unsigned int pasid,
        bool migration = false;
        int r = 0;
 
-       if (!KFD_IS_SVM_API_SUPPORTED(adev->kfd.dev)) {
+       if (!KFD_IS_SVM_API_SUPPORTED(adev)) {
                pr_debug("device does not support SVM\n");
                return -EFAULT;
        }
@@ -3112,7 +3112,7 @@ int svm_range_list_init(struct kfd_process *p)
        spin_lock_init(&svms->deferred_list_lock);
 
        for (i = 0; i < p->n_pdds; i++)
-               if (KFD_IS_SVM_API_SUPPORTED(p->pdds[i]->dev->kfd))
+               if (KFD_IS_SVM_API_SUPPORTED(p->pdds[i]->dev->adev))
                        bitmap_set(svms->bitmap_supported, i, 1);
 
        return 0;
index 7515ddade3ae96d6bdcb99f7df9ceac454d5fb89..021def496f5acd50603fa42c91d0930ccdd843f3 100644 (file)
@@ -200,8 +200,8 @@ void svm_range_list_lock_and_flush_work(struct svm_range_list *svms, struct mm_s
 /* SVM API and HMM page migration work together, device memory type
  * is initialized to not 0 when page migration register device memory.
  */
-#define KFD_IS_SVM_API_SUPPORTED(dev) ((dev)->pgmap.type != 0 ||\
-                                      (dev)->adev->gmc.is_app_apu)
+#define KFD_IS_SVM_API_SUPPORTED(adev) ((adev)->kfd.pgmap.type != 0 ||\
+                                       (adev)->gmc.is_app_apu)
 
 void svm_range_bo_unref_async(struct svm_range_bo *svm_bo);
 
index d2a42b6b1fa897cd9f5b4600c2ccc6e32b657344..6d6243b978e1cebfa2d2da13da6e216c1cea9888 100644 (file)
@@ -2021,7 +2021,7 @@ int kfd_topology_add_device(struct kfd_node *gpu)
                dev->node_props.capability |= (dev->gpu->adev->ras_enabled != 0) ?
                        HSA_CAP_RASEVENTNOTIFY : 0;
 
-       if (KFD_IS_SVM_API_SUPPORTED(dev->gpu->adev->kfd.dev))
+       if (KFD_IS_SVM_API_SUPPORTED(dev->gpu->adev))
                dev->node_props.capability |= HSA_CAP_SVMAPI_SUPPORTED;
 
        kfd_debug_print_topology();