From ccba2e850b0a29f3c8ab5063094125ed2fbd4e09 Mon Sep 17 00:00:00 2001 From: Deepak Nibade Date: Thu, 23 Jul 2020 12:22:56 +0530 Subject: [PATCH] gpu: nvgpu: add mutex to serialize profiler ioctl calls Add new mutex prof->ioctl_lock to serialize all IOCTL calls on profiler object. Running concurrent IOCTL calls could lead to races and corrupted state. Bug 2510974 Jira NVGPU-5360 Change-Id: I66a8d9078c35475a13442ccd34b61aca5b9c1d2b Signed-off-by: Deepak Nibade Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2389652 Reviewed-by: automaticguardword Reviewed-by: svc-mobile-coverity Reviewed-by: svc-mobile-misra Reviewed-by: svc-mobile-cert Reviewed-by: Alex Waterman Reviewed-by: mobile promotions Tested-by: mobile promotions GVS: Gerrit_Virtual_Submit --- drivers/gpu/nvgpu/common/profiler/profiler.c | 2 ++ drivers/gpu/nvgpu/include/nvgpu/profiler.h | 4 ++++ drivers/gpu/nvgpu/os/linux/ioctl_prof.c | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/drivers/gpu/nvgpu/common/profiler/profiler.c b/drivers/gpu/nvgpu/common/profiler/profiler.c index 4d4428648..1ceccd30a 100644 --- a/drivers/gpu/nvgpu/common/profiler/profiler.c +++ b/drivers/gpu/nvgpu/common/profiler/profiler.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -52,6 +53,7 @@ int nvgpu_profiler_alloc(struct gk20a *g, prof->scope = scope; prof->g = g; + nvgpu_mutex_init(&prof->ioctl_lock); nvgpu_init_list_node(&prof->prof_obj_entry); nvgpu_list_add(&prof->prof_obj_entry, &g->profiler_objects); diff --git a/drivers/gpu/nvgpu/include/nvgpu/profiler.h b/drivers/gpu/nvgpu/include/nvgpu/profiler.h index bab004940..b01912195 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/profiler.h +++ b/drivers/gpu/nvgpu/include/nvgpu/profiler.h @@ -26,6 +26,7 @@ #ifdef CONFIG_NVGPU_PROFILER #include +#include #include struct gk20a; @@ -57,6 +58,9 @@ struct nvgpu_profiler_object { */ bool context_init; + /* Lock to serialize IOCTL/DEVCTL calls */ + struct nvgpu_mutex ioctl_lock; + /* If profiler object has reservation for each resource. */ bool reserved[NVGPU_PROFILER_PM_RESOURCE_TYPE_COUNT]; diff --git a/drivers/gpu/nvgpu/os/linux/ioctl_prof.c b/drivers/gpu/nvgpu/os/linux/ioctl_prof.c index 67b09bf0c..0b96f1fd9 100644 --- a/drivers/gpu/nvgpu/os/linux/ioctl_prof.c +++ b/drivers/gpu/nvgpu/os/linux/ioctl_prof.c @@ -200,6 +200,8 @@ long nvgpu_prof_fops_ioctl(struct file *filp, unsigned int cmd, nvgpu_log(g, gpu_dbg_prof, "Profiler handle %u received IOCTL cmd %u", prof->prof_handle, cmd); + nvgpu_mutex_acquire(&prof->ioctl_lock); + nvgpu_speculation_barrier(); switch (cmd) { @@ -218,6 +220,8 @@ long nvgpu_prof_fops_ioctl(struct file *filp, unsigned int cmd, break; } + nvgpu_mutex_release(&prof->ioctl_lock); + if ((err == 0) && (_IOC_DIR(cmd) & _IOC_READ)) err = copy_to_user((void __user *)arg, buf, _IOC_SIZE(cmd));