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));