[PATCH 1/1] drm/amdkfd: Improve kfd_process lookup in kfd_ioctl
Philip Yang
philip.yang at amd.com
Thu Dec 5 16:10:24 UTC 2019
One comment in line.
With it is fixed, this is reviewed by Philip Yang <Philip.Yang at amd.com>
Philip
On 2019-12-04 11:13 p.m., Felix Kuehling wrote:
> 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 at 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 2cb51d1e857c..1aebda4bbbe7 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> @@ -42,6 +42,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";
> @@ -51,6 +52,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,
> };
>
> @@ -124,8 +126,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);
> @@ -133,6 +140,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)
> {
> @@ -1840,9 +1857,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 8276601a122f..bb2f26532feb 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> @@ -324,6 +324,8 @@ struct kfd_process *kfd_create_process(struct file *filep)
> (int)process->lead_thread->pid);
> }
> out:
> + if (process)
if (!IS_ERR_OR_NULL(process))
> + kref_get(&process->ref);
> mutex_unlock(&kfd_processes_mutex);
>
> return process;
>
More information about the amd-gfx
mailing list