AMD General

A new VRAM allocation needs to meet:

        adev->kfd.vram_used + vram_needed <= vram_available

kfd.vram_used already includes BOs that are later pinned.
Pinning does not consume extra VRAM. Subtracting vram_pin_size
without adding back kfd.vram_pinned counts those bytes twice
and causes fake-OOM while VRAM is still free.

Add kfd.vram_pinned so reserve_mem_limit() matches
get_available_memory().

Signed-off-by: Zhen Han <[email protected]>
---
v2:
- keep vram_pin_size; add kfd.vram_pinned in reserve_mem_limit
  (Mukul Joshi)
- leave get_available_memory unchanged
- drop former 2/2 (Christian König)

 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index 89958d0f7e59..03d64758147d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -237,7 +237,8 @@ int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device 
*adev,
        if (adev && xcp_id >= 0 && (!adev->apu_prefer_gtt || 
adev->gmc.is_app_apu)) {
                uint64_t vram_available =
                        vram_size - reserved_for_pt - reserved_for_ras -
-                       atomic64_read(&adev->vram_pin_size);
+                       atomic64_read(&adev->vram_pin_size) +
+                       atomic64_read(&adev->kfd.vram_pinned);
                if (adev->kfd.vram_used[xcp_id] + vram_needed > vram_available) 
{
                        ret = -ENOMEM;
                        goto release;
--
2.43.7

Reply via email to