]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
Merge tag 'mm-stable-2023-02-20-13-37' of git://git.kernel.org/pub/scm/linux/kernel...
[thirdparty/linux.git] / drivers / gpu / drm / amd / amdkfd / kfd_chardev.c
index d0933dd9af06d4f06efd2d967fa28809c89c72d2..a0e30f21e12e70a763b0a773895b20daee59b13a 100644 (file)
@@ -1065,6 +1065,20 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep,
                mutex_unlock(&p->svms.lock);
                return -EADDRINUSE;
        }
+
+       /* When register user buffer check if it has been registered by svm by
+        * buffer cpu virtual address.
+        */
+       if ((flags & KFD_IOC_ALLOC_MEM_FLAGS_USERPTR) &&
+           interval_tree_iter_first(&p->svms.objects,
+                                    args->mmap_offset >> PAGE_SHIFT,
+                                    (args->mmap_offset  + args->size - 1) >> PAGE_SHIFT)) {
+               pr_err("User Buffer Address: 0x%llx already allocated by SVM\n",
+                       args->mmap_offset);
+               mutex_unlock(&p->svms.lock);
+               return -EADDRINUSE;
+       }
+
        mutex_unlock(&p->svms.lock);
 #endif
        mutex_lock(&p->mutex);
@@ -1127,8 +1141,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);