diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/ctxsw_trace_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/ctxsw_trace_gk20a.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/ctxsw_trace_gk20a.c b/drivers/gpu/nvgpu/gk20a/ctxsw_trace_gk20a.c index e33477f6..4ad2abd6 100644 --- a/drivers/gpu/nvgpu/gk20a/ctxsw_trace_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/ctxsw_trace_gk20a.c | |||
@@ -276,14 +276,20 @@ int gk20a_ctxsw_dev_open(struct inode *inode, struct file *filp) | |||
276 | const int vmid = 0; | 276 | const int vmid = 0; |
277 | 277 | ||
278 | g = container_of(inode->i_cdev, struct gk20a, ctxsw.cdev); | 278 | g = container_of(inode->i_cdev, struct gk20a, ctxsw.cdev); |
279 | g = gk20a_get(g); | ||
280 | if (!g) | ||
281 | return -ENODEV; | ||
282 | |||
279 | gk20a_dbg(gpu_dbg_fn|gpu_dbg_ctxsw, "g=%p", g); | 283 | gk20a_dbg(gpu_dbg_fn|gpu_dbg_ctxsw, "g=%p", g); |
280 | 284 | ||
281 | if (!capable(CAP_SYS_ADMIN)) | 285 | if (!capable(CAP_SYS_ADMIN)) { |
282 | return -EPERM; | 286 | err = -EPERM; |
287 | goto free_ref; | ||
288 | } | ||
283 | 289 | ||
284 | err = gk20a_busy(g->dev); | 290 | err = gk20a_busy(g->dev); |
285 | if (err) | 291 | if (err) |
286 | return err; | 292 | goto free_ref; |
287 | 293 | ||
288 | trace = g->ctxsw_trace; | 294 | trace = g->ctxsw_trace; |
289 | if (!trace) { | 295 | if (!trace) { |
@@ -325,7 +331,9 @@ done: | |||
325 | 331 | ||
326 | idle: | 332 | idle: |
327 | gk20a_idle(g->dev); | 333 | gk20a_idle(g->dev); |
328 | 334 | free_ref: | |
335 | if (err) | ||
336 | gk20a_put(g); | ||
329 | return err; | 337 | return err; |
330 | } | 338 | } |
331 | 339 | ||
@@ -346,7 +354,7 @@ int gk20a_ctxsw_dev_release(struct inode *inode, struct file *filp) | |||
346 | dev->g->ops.fecs_trace.free_user_buffer(dev->g); | 354 | dev->g->ops.fecs_trace.free_user_buffer(dev->g); |
347 | dev->hdr = NULL; | 355 | dev->hdr = NULL; |
348 | } | 356 | } |
349 | 357 | gk20a_put(g); | |
350 | return 0; | 358 | return 0; |
351 | } | 359 | } |
352 | 360 | ||