]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amdkfd: Page aligned memory reserve size
authorPhilip Yang <Philip.Yang@amd.com>
Mon, 9 Jan 2023 23:08:17 +0000 (18:08 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 11 Jan 2023 21:41:03 +0000 (16:41 -0500)
Use page aligned size to reserve memory usage because page aligned TTM
BO size is used to unreserve memory usage, otherwise no page aligned
size causes memory usage accounting unbalanced.

Change vram_used definition type to int64_t to be able to trigger
WARN_ONCE(adev && adev->kfd.vram_used < 0, "..."), to help debug the
accounting issue with warning and backtrace.

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.h
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c

index fb41869e357a56bf150e8f96035435c388fbf1e0..333780491867cc213b9e3da867f0a9171ba4255f 100644 (file)
@@ -97,7 +97,7 @@ struct amdgpu_amdkfd_fence {
 
 struct amdgpu_kfd_dev {
        struct kfd_dev *dev;
-       uint64_t vram_used;
+       int64_t vram_used;
        uint64_t vram_used_aligned;
        bool init_complete;
        struct work_struct reset_work;
index cd5de5e08d2f94cc179f5e3a0f37b58bfbf9a3ee..6f236ded5f12cf943f65cc0f9417f2e602654e91 100644 (file)
@@ -1598,6 +1598,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
        struct amdgpu_bo *bo;
        struct drm_gem_object *gobj = NULL;
        u32 domain, alloc_domain;
+       uint64_t aligned_size;
        u64 alloc_flags;
        int ret;
 
@@ -1653,22 +1654,23 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
         * the memory.
         */
        if ((*mem)->aql_queue)
-               size = size >> 1;
+               size >>= 1;
+       aligned_size = PAGE_ALIGN(size);
 
        (*mem)->alloc_flags = flags;
 
        amdgpu_sync_create(&(*mem)->sync);
 
-       ret = amdgpu_amdkfd_reserve_mem_limit(adev, size, flags);
+       ret = amdgpu_amdkfd_reserve_mem_limit(adev, aligned_size, flags);
        if (ret) {
                pr_debug("Insufficient memory\n");
                goto err_reserve_limit;
        }
 
        pr_debug("\tcreate BO VA 0x%llx size 0x%llx domain %s\n",
-                       va, size, domain_string(alloc_domain));
+                       va, (*mem)->aql_queue ? size << 1 : size, domain_string(alloc_domain));
 
-       ret = amdgpu_gem_object_create(adev, size, 1, alloc_domain, alloc_flags,
+       ret = amdgpu_gem_object_create(adev, aligned_size, 1, alloc_domain, alloc_flags,
                                       bo_type, NULL, &gobj);
        if (ret) {
                pr_debug("Failed to create BO on domain %s. ret %d\n",
@@ -1725,7 +1727,7 @@ err_node_allow:
        /* Don't unreserve system mem limit twice */
        goto err_reserve_limit;
 err_bo_create:
-       amdgpu_amdkfd_unreserve_mem_limit(adev, size, flags);
+       amdgpu_amdkfd_unreserve_mem_limit(adev, aligned_size, flags);
 err_reserve_limit:
        mutex_destroy(&(*mem)->lock);
        if (gobj)
index 6d291aa6386bd7561a6ed87d5c66ed9409fe2521..f79b8e964140e53e1092dddc403d504b664e67f7 100644 (file)
@@ -1127,8 +1127,13 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep,
        }
 
        /* Update the VRAM usage count */
-       if (flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM)
-               WRITE_ONCE(pdd->vram_usage, pdd->vram_usage + args->size);
+       if (flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM) {
+               uint64_t size = args->size;
+
+               if (flags & KFD_IOC_ALLOC_MEM_FLAGS_AQL_QUEUE_MEM)
+                       size >>= 1;
+               WRITE_ONCE(pdd->vram_usage, pdd->vram_usage + PAGE_ALIGN(size));
+       }
 
        mutex_unlock(&p->mutex);