gpu: nvgpu: serialize debug session IOCTLs
Deepak Nibade [Mon, 23 Jan 2017 11:32:07 +0000 (16:32 +0530)]
Hold debug_s->ioctl_lock for all debug session IOCTLs to prevent
multi-threaded user space IOCTL calls.
Debug session IOCTL calls are not thread-safe and hence this
serialization is required.

Bug 1832267
Bug 1832095
Bug 1849492
Bug 1883499

Change-Id: I847ac951601d4f0093546b592bdb8c8f00185317
Reviewed-on: http://git-master/r/1286436
Signed-off-by: Gagan Grover <ggrover@nvidia.com>
Reviewed-on: http://git-master/r/1292432
Signed-off-by: Debarshi Dutta <ddutta@nvidia.com>
(cherry picked from commit d4629278161f2dc3c74e0f13c6ca08038355dd22 in
rel-24)
Reviewed-on: http://git-master/r/1487009
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Bibek Basu <bbasu@nvidia.com>
Tested-by: Bibek Basu <bbasu@nvidia.com>

drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h

index 1e24785..ef029a3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Tegra GK20A GPU Debugger/Profiler Driver
  *
- * Copyright (c) 2013-2015, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2013-2017, NVIDIA CORPORATION.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
@@ -99,6 +99,7 @@ static int gk20a_dbg_gpu_do_dev_open(struct inode *inode,
 
        INIT_LIST_HEAD(&dbg_session->dbg_s_list_node);
        init_waitqueue_head(&dbg_session->dbg_events.wait_queue);
+       mutex_init(&dbg_session->ioctl_lock);
        dbg_session->dbg_events.events_enabled = false;
        dbg_session->dbg_events.num_pending_events = 0;
 
@@ -419,6 +420,9 @@ long gk20a_dbg_gpu_dev_ioctl(struct file *filp, unsigned int cmd,
                gk20a_idle(g->dev);
        }
 
+       /* protect from threaded user space calls */
+       mutex_lock(&dbg_s->ioctl_lock);
+
        switch (cmd) {
        case NVGPU_DBG_GPU_IOCTL_BIND_CHANNEL:
                err = dbg_bind_channel_gk20a(dbg_s,
@@ -473,6 +477,8 @@ long gk20a_dbg_gpu_dev_ioctl(struct file *filp, unsigned int cmd,
                break;
        }
 
+       mutex_unlock(&dbg_s->ioctl_lock);
+
        gk20a_dbg(gpu_dbg_gpu_dbg, "ret=%d", err);
 
        if ((err == 0) && (_IOC_DIR(cmd) & _IOC_READ))
index 27084c0..36fa454 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Tegra GK20A GPU Debugger Driver
  *
- * Copyright (c) 2013-2014, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2013-2017, NVIDIA CORPORATION.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
@@ -76,6 +76,8 @@ struct dbg_session_gk20a {
        /* event support */
        struct dbg_gpu_session_events dbg_events;
        struct list_head dbg_s_list_node;
+
+       struct mutex ioctl_lock;
 };
 
 extern struct dbg_gpu_session_ops dbg_gpu_session_ops_gk20a;