Current apu_prefer_gtt setting only check gtt_size, which could be set
by user to a larger than system memory value (by ttm modules paramter
pages_limit). E.g. carveout vram 32GB, gtt_size 50GB (by ttm modules
paramter pages_limit), system memory 31GB. In that case, apu_prefer_gtt
will be set incorrectly. Take system memory into account when set
apu_prefer_gtt.

Signed-off-by: Yifan Zhang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c       | 2 --
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h       | 4 ++--
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 6 +++++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c          | 7 ++++++-
 4 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index 3bfd79c89df3..a6ee9d9bfafb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -170,8 +170,6 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
        int i;
        int last_valid_bit;
 
-       amdgpu_amdkfd_gpuvm_init_mem_limits();
-
        if (adev->kfd.dev) {
                struct kgd2kfd_shared_resources gpu_resources = {
                        .compute_vmid_bitmap =
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index cdbab7f8cee8..b720f4bd646f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -369,7 +369,7 @@ u64 amdgpu_amdkfd_xcp_memory_size(struct amdgpu_device 
*adev, int xcp_id);
 
 
 #if IS_ENABLED(CONFIG_HSA_AMD)
-void amdgpu_amdkfd_gpuvm_init_mem_limits(void);
+void amdgpu_amdkfd_gpuvm_init_mem_limits(uint64_t *max_system_mem_limit);
 void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev,
                                struct amdgpu_vm *vm);
 
@@ -382,7 +382,7 @@ void amdgpu_amdkfd_release_notify(struct amdgpu_bo *bo);
 void amdgpu_amdkfd_reserve_system_mem(uint64_t size);
 #else
 static inline
-void amdgpu_amdkfd_gpuvm_init_mem_limits(void)
+void amdgpu_amdkfd_gpuvm_init_mem_limits(uint64_t *max_system_mem_limit)
 {
 }
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index 8a869fe41acd..4b176ebc7da9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -109,7 +109,7 @@ static bool reuse_dmamap(struct amdgpu_device *adev, struct 
amdgpu_device *bo_ad
  *  System (TTM + userptr) memory - 15/16th System RAM
  *  TTM memory - 3/8th System RAM
  */
-void amdgpu_amdkfd_gpuvm_init_mem_limits(void)
+void amdgpu_amdkfd_gpuvm_init_mem_limits(uint64_t *max_system_mem_limit)
 {
        struct sysinfo si;
        uint64_t mem;
@@ -121,6 +121,7 @@ void amdgpu_amdkfd_gpuvm_init_mem_limits(void)
        mem = si.totalram - si.totalhigh;
        mem *= si.mem_unit;
 
+
        spin_lock_init(&kfd_mem_limit.mem_limit_lock);
        kfd_mem_limit.max_system_mem_limit = mem - (mem >> 6);
        if (kfd_mem_limit.max_system_mem_limit < 2 * AMDGPU_RESERVE_MEM_LIMIT)
@@ -129,9 +130,12 @@ void amdgpu_amdkfd_gpuvm_init_mem_limits(void)
                kfd_mem_limit.max_system_mem_limit -= AMDGPU_RESERVE_MEM_LIMIT;
 
        kfd_mem_limit.max_ttm_mem_limit = ttm_tt_pages_limit() << PAGE_SHIFT;
+
        pr_debug("Kernel memory limit %lluM, TTM limit %lluM\n",
                (kfd_mem_limit.max_system_mem_limit >> 20),
                (kfd_mem_limit.max_ttm_mem_limit >> 20));
+
+       max_system_mem_limit = kfd_mem_limit.max_system_mem_limit;
 }
 
 void amdgpu_amdkfd_reserve_system_mem(uint64_t size)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 714fd8d12ca5..22ccdaa3a2df 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -2071,6 +2071,7 @@ static void amdgpu_ttm_buffer_entity_fini(struct 
amdgpu_gtt_mgr *mgr,
 int amdgpu_ttm_init(struct amdgpu_device *adev)
 {
        uint64_t gtt_size;
+       uint64_t max_system_mem_limit;
        int r;
 
        dma_set_max_seg_size(adev->dev, UINT_MAX);
@@ -2210,8 +2211,12 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
        dev_info(adev->dev, " %uM of GTT memory ready.\n",
                 (unsigned int)(gtt_size / (1024 * 1024)));
 
+
+       amdgpu_amdkfd_gpuvm_init_mem_limits(&max_system_mem_limit);
+
        if (adev->flags & AMD_IS_APU) {
-               if (adev->gmc.real_vram_size < gtt_size)
+               if (adev->gmc.real_vram_size < gtt_size &&
+                       adev->gmc.real_vram_size < max_system_mem_limit)
                        adev->apu_prefer_gtt = true;
        }
 
-- 
2.43.0

Reply via email to