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