From d718c6ae2e402ed46e1eb692ae41880c115ae3b1 Mon Sep 17 00:00:00 2001 From: Oak Zeng Date: Fri, 8 Dec 2017 10:45:30 -0500 Subject: [PATCH 3043/4131] drm/amdkfd: Fail public mem alloc on small-bar dev Host accessible memory allocation on none-large bar device node is not allowed. Fail it in alloc ioctl. Change-Id: Iffd8260d5b6ef1a8858d5cc2e3c64bcc9028ea4b Signed-off-by: Oak Zeng --- drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c index c36d546..7e63b8b 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c @@ -46,6 +46,7 @@ static long kfd_ioctl(struct file *, unsigned int, unsigned long); static int kfd_open(struct inode *, struct file *); static int kfd_mmap(struct file *, struct vm_area_struct *); +static bool kfd_dev_is_large_bar(struct kfd_dev *dev); static const char kfd_dev_name[] = "kfd"; @@ -1124,6 +1125,25 @@ static int kfd_ioctl_alloc_scratch_memory(struct file *filep, return -EFAULT; } +bool kfd_dev_is_large_bar(struct kfd_dev *dev) +{ + struct kfd_local_mem_info mem_info; + + if (debug_largebar) { + pr_debug("Simulate large-bar allocation on non large-bar machine\n"); + return true; + } + + if (dev->device_info->is_need_iommu_device) + return false; + + dev->kfd2kgd->get_local_mem_info(dev->kgd, &mem_info); + if (mem_info.local_mem_size_private == 0 && + mem_info.local_mem_size_public > 0) + return true; + return false; +} + static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep, struct kfd_process *p, void *data) { @@ -1144,6 +1164,13 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep, if (!dev) return -EINVAL; + if ((flags & KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC) && + (flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM) && + !kfd_dev_is_large_bar(dev)) { + pr_err("Alloc host visible vram on small bar is not allowed\n"); + return -EINVAL; + } + if (flags & KFD_IOC_ALLOC_MEM_FLAGS_USERPTR) { /* Check if the userptr corresponds to another (or third-party) * device local memory. If so treat is as a doorbell. User -- 2.7.4