drm/amdkfd: Evict BO itself for contiguous allocation
authorPhilip Yang <Philip.Yang@amd.com>
Fri, 5 Apr 2024 20:02:50 +0000 (16:02 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 30 Apr 2024 13:59:51 +0000 (09:59 -0400)
If the BO pages pinned for RDMA is not contiguous on VRAM, evict it to
system memory first to free the VRAM space, then allocate contiguous
VRAM space, and then move it from system memory back to VRAM.

v6: user context should use interruptible call (Felix)

Signed-off-by: Philip Yang <Philip.Yang@amd.com>
Reviewed-by: Felix Kuehling <felix.kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c

index 5c06279c6bef4558af38fb7fbd15b6059bfd0895..eccb5f30f3b3fbd18ec95625b19c152a38dac649 100644 (file)
@@ -1470,13 +1470,30 @@ static int amdgpu_amdkfd_gpuvm_pin_bo(struct amdgpu_bo *bo, u32 domain)
        if (unlikely(ret))
                return ret;
 
+       if (bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS) {
+               /*
+                * If bo is not contiguous on VRAM, move to system memory first to ensure
+                * we can get contiguous VRAM space after evicting other BOs.
+                */
+               if (!(bo->tbo.resource->placement & TTM_PL_FLAG_CONTIGUOUS)) {
+                       struct ttm_operation_ctx ctx = { true, false };
+
+                       amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_GTT);
+                       ret = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
+                       if (unlikely(ret)) {
+                               pr_debug("validate bo 0x%p to GTT failed %d\n", &bo->tbo, ret);
+                               goto out;
+                       }
+               }
+       }
+
        ret = amdgpu_bo_pin_restricted(bo, domain, 0, 0);
        if (ret)
                pr_err("Error in Pinning BO to domain: %d\n", domain);
 
        amdgpu_bo_sync_wait(bo, AMDGPU_FENCE_OWNER_KFD, false);
+out:
        amdgpu_bo_unreserve(bo);
-
        return ret;
 }