summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/sched_gk20a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/sched_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/sched_gk20a.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/sched_gk20a.c b/drivers/gpu/nvgpu/gk20a/sched_gk20a.c
index 6fdc2774..a73e7993 100644
--- a/drivers/gpu/nvgpu/gk20a/sched_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/sched_gk20a.c
@@ -377,21 +377,28 @@ int gk20a_sched_dev_open(struct inode *inode, struct file *filp)
377{ 377{
378 struct gk20a *g = container_of(inode->i_cdev, 378 struct gk20a *g = container_of(inode->i_cdev,
379 struct gk20a, sched.cdev); 379 struct gk20a, sched.cdev);
380 struct gk20a_sched_ctrl *sched = &g->sched_ctrl; 380 struct gk20a_sched_ctrl *sched;
381 int err; 381 int err = 0;
382
383 g = gk20a_get(g);
384 if (!g)
385 return -ENODEV;
386 sched = &g->sched_ctrl;
382 387
383 gk20a_dbg(gpu_dbg_fn | gpu_dbg_sched, "g=%p", g); 388 gk20a_dbg(gpu_dbg_fn | gpu_dbg_sched, "g=%p", g);
384 389
385 if (!sched->sw_ready) { 390 if (!sched->sw_ready) {
386 err = gk20a_busy(g->dev); 391 err = gk20a_busy(g->dev);
387 if (err) 392 if (err)
388 return err; 393 goto free_ref;
389 394
390 gk20a_idle(g->dev); 395 gk20a_idle(g->dev);
391 } 396 }
392 397
393 if (!nvgpu_mutex_tryacquire(&sched->busy_lock)) 398 if (!nvgpu_mutex_tryacquire(&sched->busy_lock)) {
394 return -EBUSY; 399 err = -EBUSY;
400 goto free_ref;
401 }
395 402
396 memcpy(sched->recent_tsg_bitmap, sched->active_tsg_bitmap, 403 memcpy(sched->recent_tsg_bitmap, sched->active_tsg_bitmap,
397 sched->bitmap_size); 404 sched->bitmap_size);
@@ -400,7 +407,10 @@ int gk20a_sched_dev_open(struct inode *inode, struct file *filp)
400 filp->private_data = sched; 407 filp->private_data = sched;
401 gk20a_dbg(gpu_dbg_sched, "filp=%p sched=%p", filp, sched); 408 gk20a_dbg(gpu_dbg_sched, "filp=%p sched=%p", filp, sched);
402 409
403 return 0; 410free_ref:
411 if (err)
412 gk20a_put(g);
413 return err;
404} 414}
405 415
406long gk20a_sched_dev_ioctl(struct file *filp, unsigned int cmd, 416long gk20a_sched_dev_ioctl(struct file *filp, unsigned int cmd,
@@ -511,6 +521,7 @@ int gk20a_sched_dev_release(struct inode *inode, struct file *filp)
511 nvgpu_mutex_release(&sched->control_lock); 521 nvgpu_mutex_release(&sched->control_lock);
512 522
513 nvgpu_mutex_release(&sched->busy_lock); 523 nvgpu_mutex_release(&sched->busy_lock);
524 gk20a_put(g);
514 return 0; 525 return 0;
515} 526}
516 527