diff options
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/sched_gk20a.c | 38 |
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 | ||
689 | free_control_lock: | ||
690 | nvgpu_mutex_destroy(&sched->control_lock); | ||
691 | free_status_lock: | ||
692 | nvgpu_mutex_destroy(&sched->status_lock); | ||
693 | free_ref: | ||
694 | nvgpu_kfree(g, sched->ref_tsg_bitmap); | ||
675 | free_recent: | 695 | free_recent: |
676 | nvgpu_kfree(g, sched->recent_tsg_bitmap); | 696 | nvgpu_kfree(g, sched->recent_tsg_bitmap); |
677 | |||
678 | free_active: | 697 | free_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 | ||
684 | void gk20a_sched_ctrl_cleanup(struct gk20a *g) | 703 | void 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 | } |