summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
diff options
context:
space:
mode:
authorDavid Nieto <dmartineznie@nvidia.com>2017-02-13 14:22:59 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2017-03-20 19:39:55 -0400
commit74fe1caa2b56aab24c17ad4dd2524128fc237894 (patch)
tree0793bb92b67d64690658f3f7cd1a8e1ea93206ba /drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
parent469308becaff326da02fcf791e803e812e1cf9f8 (diff)
gpu: nvgpu: Add refcounting to driver fds
The main driver structure is not refcounted properly, so when the driver unload, file desciptors associated to the driver are kept open with dangling references to the main object. This change adds referencing to the gk20a structure. bug 200277762 JIRA: EVLR-1023 Change-Id: Id892e9e1677a344789e99bf649088c076f0bf8de Signed-off-by: David Nieto <dmartineznie@nvidia.com> Reviewed-on: http://git-master/r/1317420 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
index 821951ad..7eb742ed 100644
--- a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
@@ -101,13 +101,17 @@ static int gk20a_dbg_gpu_do_dev_open(struct inode *inode,
101 else 101 else
102 g = container_of(inode->i_cdev, 102 g = container_of(inode->i_cdev,
103 struct gk20a, prof.cdev); 103 struct gk20a, prof.cdev);
104 g = gk20a_get(g);
105 if (!g)
106 return -ENODEV;
107
104 dev = g->dev; 108 dev = g->dev;
105 109
106 gk20a_dbg(gpu_dbg_fn | gpu_dbg_gpu_dbg, "dbg session: %s", dev_name(dev)); 110 gk20a_dbg(gpu_dbg_fn | gpu_dbg_gpu_dbg, "dbg session: %s", dev_name(dev));
107 111
108 err = alloc_session(&dbg_session); 112 err = alloc_session(&dbg_session);
109 if (err) 113 if (err)
110 return err; 114 goto free_ref;
111 115
112 filp->private_data = dbg_session; 116 filp->private_data = dbg_session;
113 dbg_session->dev = dev; 117 dbg_session->dev = dev;
@@ -133,6 +137,8 @@ err_destroy_lock:
133 nvgpu_mutex_destroy(&dbg_session->ch_list_lock); 137 nvgpu_mutex_destroy(&dbg_session->ch_list_lock);
134err_free_session: 138err_free_session:
135 kfree(dbg_session); 139 kfree(dbg_session);
140free_ref:
141 gk20a_put(g);
136 return err; 142 return err;
137} 143}
138 144
@@ -494,6 +500,8 @@ int gk20a_dbg_gpu_dev_release(struct inode *inode, struct file *filp)
494 nvgpu_mutex_destroy(&dbg_s->ioctl_lock); 500 nvgpu_mutex_destroy(&dbg_s->ioctl_lock);
495 501
496 kfree(dbg_s); 502 kfree(dbg_s);
503 gk20a_put(g);
504
497 return 0; 505 return 0;
498} 506}
499 507