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.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/sched_gk20a.c b/drivers/gpu/nvgpu/gk20a/sched_gk20a.c
index 3185b211..49a09e99 100644
--- a/drivers/gpu/nvgpu/gk20a/sched_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/sched_gk20a.c
@@ -640,6 +640,7 @@ int gk20a_sched_ctrl_init(struct gk20a *g)
640{ 640{
641 struct gk20a_sched_ctrl *sched = &g->sched_ctrl; 641 struct gk20a_sched_ctrl *sched = &g->sched_ctrl;
642 struct fifo_gk20a *f = &g->fifo; 642 struct fifo_gk20a *f = &g->fifo;
643 int err;
643 644
644 if (sched->sw_ready) 645 if (sched->sw_ready)
645 return 0; 646 return 0;
@@ -656,29 +657,47 @@ int gk20a_sched_ctrl_init(struct gk20a *g)
656 return -ENOMEM; 657 return -ENOMEM;
657 658
658 sched->recent_tsg_bitmap = nvgpu_kzalloc(g, sched->bitmap_size); 659 sched->recent_tsg_bitmap = nvgpu_kzalloc(g, sched->bitmap_size);
659 if (!sched->recent_tsg_bitmap) 660 if (!sched->recent_tsg_bitmap) {
661 err = -ENOMEM;
660 goto free_active; 662 goto free_active;
663 }
661 664
662 sched->ref_tsg_bitmap = nvgpu_kzalloc(g, sched->bitmap_size); 665 sched->ref_tsg_bitmap = nvgpu_kzalloc(g, sched->bitmap_size);
663 if (!sched->ref_tsg_bitmap) 666 if (!sched->ref_tsg_bitmap) {
667 err = -ENOMEM;
664 goto free_recent; 668 goto free_recent;
669 }
665 670
666 init_waitqueue_head(&sched->readout_wq); 671 init_waitqueue_head(&sched->readout_wq);
667 nvgpu_mutex_init(&sched->status_lock); 672
668 nvgpu_mutex_init(&sched->control_lock); 673 err = nvgpu_mutex_init(&sched->status_lock);
669 nvgpu_mutex_init(&sched->busy_lock); 674 if (err)
675 goto free_ref;
676
677 err = nvgpu_mutex_init(&sched->control_lock);
678 if (err)
679 goto free_status_lock;
680
681 err = nvgpu_mutex_init(&sched->busy_lock);
682 if (err)
683 goto free_control_lock;
670 684
671 sched->sw_ready = true; 685 sched->sw_ready = true;
672 686
673 return 0; 687 return 0;
674 688
689free_control_lock:
690 nvgpu_mutex_destroy(&sched->control_lock);
691free_status_lock:
692 nvgpu_mutex_destroy(&sched->status_lock);
693free_ref:
694 nvgpu_kfree(g, sched->ref_tsg_bitmap);
675free_recent: 695free_recent:
676 nvgpu_kfree(g, sched->recent_tsg_bitmap); 696 nvgpu_kfree(g, sched->recent_tsg_bitmap);
677
678free_active: 697free_active:
679 nvgpu_kfree(g, sched->active_tsg_bitmap); 698 nvgpu_kfree(g, sched->active_tsg_bitmap);
680 699
681 return -ENOMEM; 700 return err;
682} 701}
683 702
684void gk20a_sched_ctrl_cleanup(struct gk20a *g) 703void gk20a_sched_ctrl_cleanup(struct gk20a *g)
@@ -691,5 +710,10 @@ void gk20a_sched_ctrl_cleanup(struct gk20a *g)
691 sched->active_tsg_bitmap = NULL; 710 sched->active_tsg_bitmap = NULL;
692 sched->recent_tsg_bitmap = NULL; 711 sched->recent_tsg_bitmap = NULL;
693 sched->ref_tsg_bitmap = NULL; 712 sched->ref_tsg_bitmap = NULL;
713
714 nvgpu_mutex_destroy(&sched->status_lock);
715 nvgpu_mutex_destroy(&sched->control_lock);
716 nvgpu_mutex_destroy(&sched->busy_lock);
717
694 sched->sw_ready = false; 718 sched->sw_ready = false;
695} 719}