summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
diff options
context:
space:
mode:
authorSeema Khowala <seemaj@nvidia.com>2018-05-04 13:29:14 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-05-17 12:33:04 -0400
commit4654d9abd176043e69d548d53d516e78e4054d9e (patch)
treec6c33636d9154d1cf35fb1bc7bafe2bb996d02cd /drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
parent4d63729ac8aa8fecf66bd066178e317f07560534 (diff)
gpu: nvgpu: runlist_lock released before preempt timeout recovery
Release runlist_lock and then initiate recovery if preempt timed out. Also do not issue preempt if ch, tsg or runlist id is invalid. tsgid could be invalid for below call trace gk20a_prepare_poweroff->gk20a_channel_suspend-> *_fifo_preempt_channel->*_fifo_preempt_tsg Bug 2065990 Bug 2043838 Change-Id: Ia1e3c134f06743e1258254a4a6f7256831706185 Signed-off-by: Seema Khowala <seemaj@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1662656 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gv11b/fifo_gv11b.c')
-rw-r--r--drivers/gpu/nvgpu/gv11b/fifo_gv11b.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
index 9843c7de..30e03092 100644
--- a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
+++ b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
@@ -757,6 +757,9 @@ int gv11b_fifo_preempt_channel(struct gk20a *g, u32 chid)
757 struct fifo_gk20a *f = &g->fifo; 757 struct fifo_gk20a *f = &g->fifo;
758 u32 tsgid; 758 u32 tsgid;
759 759
760 if (chid == FIFO_INVAL_CHANNEL_ID)
761 return 0;
762
760 tsgid = f->channel[chid].tsgid; 763 tsgid = f->channel[chid].tsgid;
761 nvgpu_log_info(g, "chid:%d tsgid:%d", chid, tsgid); 764 nvgpu_log_info(g, "chid:%d tsgid:%d", chid, tsgid);
762 765
@@ -813,10 +816,14 @@ int gv11b_fifo_preempt_tsg(struct gk20a *g, u32 tsgid)
813 u32 mutex_ret = 0; 816 u32 mutex_ret = 0;
814 u32 runlist_id; 817 u32 runlist_id;
815 818
816 nvgpu_log_fn(g, "%d", tsgid); 819 nvgpu_log_fn(g, "tsgid: %d", tsgid);
820 if (tsgid == FIFO_INVAL_TSG_ID)
821 return 0;
817 822
818 runlist_id = f->tsg[tsgid].runlist_id; 823 runlist_id = f->tsg[tsgid].runlist_id;
819 nvgpu_log_fn(g, "runlist_id %d", runlist_id); 824 nvgpu_log_fn(g, "runlist_id: %d", runlist_id);
825 if (runlist_id == FIFO_INVAL_RUNLIST_ID)
826 return 0;
820 827
821 nvgpu_mutex_acquire(&f->runlist_info[runlist_id].runlist_lock); 828 nvgpu_mutex_acquire(&f->runlist_info[runlist_id].runlist_lock);
822 829
@@ -829,6 +836,9 @@ int gv11b_fifo_preempt_tsg(struct gk20a *g, u32 tsgid)
829 836
830 nvgpu_mutex_release(&f->runlist_info[runlist_id].runlist_lock); 837 nvgpu_mutex_release(&f->runlist_info[runlist_id].runlist_lock);
831 838
839 if (ret)
840 gk20a_fifo_preempt_timeout_rc(g, tsgid, true);
841
832 return ret; 842 return ret;
833} 843}
834 844
@@ -888,7 +898,7 @@ static int __locked_fifo_preempt_ch_tsg(struct gk20a *g, u32 id,
888 timeout_rc_type); 898 timeout_rc_type);
889 899
890 if (ret && (timeout_rc_type == PREEMPT_TIMEOUT_RC)) 900 if (ret && (timeout_rc_type == PREEMPT_TIMEOUT_RC))
891 __locked_fifo_preempt_timeout_rc(g, id, id_type); 901 gk20a_fifo_preempt_timeout_rc(g, id, id_type);
892 902
893 return ret; 903 return ret;
894} 904}