drm/amdkfd: Page aligned memory reserve size
authorjsg <jsg@openbsd.org>
Mon, 27 Mar 2023 03:51:04 +0000 (03:51 +0000)
committerjsg <jsg@openbsd.org>
Mon, 27 Mar 2023 03:51:04 +0000 (03:51 +0000)
From Philip Yang
82a6debd4e4b98dabd99ab26a23553276559d509 in linux-6.1.y/6.1.16
0c2dece8fb541ab07b68c3312a1065fa9c927a81 in mainline linux

sys/dev/pci/drm/amd/amdgpu/amdgpu_amdkfd.h
sys/dev/pci/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
sys/dev/pci/drm/amd/amdkfd/kfd_chardev.c

index 5e0a071..fec745f 100644 (file)
@@ -95,7 +95,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 8de1399..2d8e849 100644 (file)
@@ -1653,6 +1653,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;
 
@@ -1703,22 +1704,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",
@@ -1775,7 +1777,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 91eff30..23769c4 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);