AMD General

Pinned objects that are not kfd objects reduce the total vram available to kfd, 
so we subtract the total size of pinned objects from kdf vram availability. 
However this double counts objects pinned by kfd itself, because they are 
counted both as used and pinned. So track the total size of objects pinned by 
kfd and add it back to kfd availability to remove the double accounting.

Signed-off-by: Daniel Phillips <[email protected]>
Reviewed-by: Felix Kuehling <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h       |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 11 +++++++++++
 2 files changed, 12 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index 1b7dc0d3963b..056dd7375d24 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -106,6 +106,7 @@ struct amdgpu_kfd_dev {
        struct kfd_dev *dev;
        int64_t vram_used[MAX_XCP];
        uint64_t vram_used_aligned[MAX_XCP];
+       atomic64_t vram_pinned;
        bool init_complete;
        struct work_struct reset_work;

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index a5d1d83ee5d3..5a4072792a57 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -1536,6 +1536,11 @@ static int amdgpu_amdkfd_gpuvm_pin_bo(struct amdgpu_bo 
*bo, u32 domain)
                pr_err("Error in Pinning BO to domain: %d\n", domain);

        amdgpu_bo_sync_wait(bo, AMDGPU_FENCE_OWNER_KFD, false);
+
+       if (!ret && bo->tbo.resource->mem_type == TTM_PL_VRAM)
+               atomic64_add(amdgpu_bo_size(bo),
+                       &amdgpu_ttm_adev(bo->tbo.bdev)->kfd.vram_pinned);
+
 out:
        amdgpu_bo_unreserve(bo);
        return ret;
@@ -1558,6 +1563,11 @@ static void amdgpu_amdkfd_gpuvm_unpin_bo(struct 
amdgpu_bo *bo)
                return;

        amdgpu_bo_unpin(bo);
+
+       if (bo->tbo.resource->mem_type == TTM_PL_VRAM)
+               atomic64_sub(amdgpu_bo_size(bo),
+                       &amdgpu_ttm_adev(bo->tbo.bdev)->kfd.vram_pinned);
+
        amdgpu_bo_unreserve(bo);
 }

@@ -1679,6 +1689,7 @@ size_t amdgpu_amdkfd_get_available_memory(struct 
amdgpu_device *adev,
                vram_available = KFD_XCP_MEMORY_SIZE(adev, xcp_id)
                        - adev->kfd.vram_used_aligned[xcp_id]
                        - atomic64_read(&adev->vram_pin_size)
+                       + atomic64_read(&adev->kfd.vram_pinned)
                        - reserved_for_pt
                        - reserved_for_ras;

--
2.43.0

Reply via email to