aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4720-drm-amdkfd-Improve-kfd_process-lookup-in-kfd_ioctl.patch
diff options
context:
space:
mode:
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.patch104
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
+