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
