diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4720-drm-amdkfd-Improve-kfd_process-lookup-in-kfd_ioctl.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4720-drm-amdkfd-Improve-kfd_process-lookup-in-kfd_ioctl.patch | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4720-drm-amdkfd-Improve-kfd_process-lookup-in-kfd_ioctl.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4720-drm-amdkfd-Improve-kfd_process-lookup-in-kfd_ioctl.patch new file mode 100644 index 00000000..03e077e6 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4720-drm-amdkfd-Improve-kfd_process-lookup-in-kfd_ioctl.patch @@ -0,0 +1,104 @@ +From 2ee4b662abfe96542dfd01f2013e4c509d579c57 Mon Sep 17 00:00:00 2001 +From: Felix Kuehling <Felix.Kuehling@amd.com> +Date: Wed, 4 Dec 2019 21:23:08 -0500 +Subject: [PATCH 4720/4736] drm/amdkfd: Improve kfd_process lookup in kfd_ioctl + +Use filep->private_data to store a pointer to the kfd_process data +structure. Take an extra reference for that, which gets released in +the kfd_release callback. Check that the process calling kfd_ioctl +is the same that opened the file descriptor. Return -EBADF if it's +not, so that this error can be distinguished in user mode. + +Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> +Philip Yang <Philip.Yang@amd.com> +--- + drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 30 ++++++++++++++++++++---- + drivers/gpu/drm/amd/amdkfd/kfd_process.c | 2 ++ + 2 files changed, 28 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +index d9cdb25974f9..1946ac4c95dd 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +@@ -50,6 +50,7 @@ + + static long kfd_ioctl(struct file *, unsigned int, unsigned long); + static int kfd_open(struct inode *, struct file *); ++static int kfd_release(struct inode *, struct file *); + static int kfd_mmap(struct file *, struct vm_area_struct *); + + static const char kfd_dev_name[] = "kfd"; +@@ -59,6 +60,7 @@ static const struct file_operations kfd_fops = { + .unlocked_ioctl = kfd_ioctl, + .compat_ioctl = kfd_ioctl, + .open = kfd_open, ++ .release = kfd_release, + .mmap = kfd_mmap, + }; + +@@ -142,8 +144,13 @@ static int kfd_open(struct inode *inode, struct file *filep) + if (IS_ERR(process)) + return PTR_ERR(process); + +- if (kfd_is_locked()) ++ if (kfd_is_locked()) { ++ kfd_unref_process(process); + return -EAGAIN; ++ } ++ ++ /* filep now owns the reference returned by kfd_create_process */ ++ filep->private_data = process; + + dev_dbg(kfd_device, "process %d opened, compat mode (32 bit) - %d\n", + process->pasid, process->is_32bit_user_mode); +@@ -151,6 +158,16 @@ static int kfd_open(struct inode *inode, struct file *filep) + return 0; + } + ++static int kfd_release(struct inode *inode, struct file *filep) ++{ ++ struct kfd_process *process = filep->private_data; ++ ++ if (process) ++ kfd_unref_process(process); ++ ++ return 0; ++} ++ + static int kfd_ioctl_get_version(struct file *filep, struct kfd_process *p, + void *data) + { +@@ -2996,9 +3013,14 @@ static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) + + dev_dbg(kfd_device, "ioctl cmd 0x%x (#0x%x), arg 0x%lx\n", cmd, nr, arg); + +- process = kfd_get_process(current); +- if (IS_ERR(process)) { +- dev_dbg(kfd_device, "no process\n"); ++ /* Get the process struct from the filep. Only the process ++ * that opened /dev/kfd can use the file descriptor. Child ++ * processes need to create their own KFD device context. ++ */ ++ process = filep->private_data; ++ if (process->lead_thread != current->group_leader) { ++ dev_dbg(kfd_device, "Using KFD FD in wrong process\n"); ++ retcode = -EBADF; + goto err_i1; + } + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c +index d78c36ba54e3..ca7b80bd0114 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c +@@ -328,6 +328,8 @@ struct kfd_process *kfd_create_process(struct file *filep) + (int)process->lead_thread->pid); + } + out: ++ if (!IS_ERR(process)) ++ kref_get(&process->ref); + mutex_unlock(&kfd_processes_mutex); + + return process; +-- +2.17.1 + |