summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/fifo_gk20a.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/gk20a/fifo_gk20a.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/gk20a/fifo_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/fifo_gk20a.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
index aada3065..22dc1d60 100644
--- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
@@ -2721,7 +2721,7 @@ int gk20a_fifo_is_preempt_pending(struct gk20a *g, u32 id,
2721 return ret; 2721 return ret;
2722} 2722}
2723 2723
2724void __locked_fifo_preempt_timeout_rc(struct gk20a *g, u32 id, 2724void gk20a_fifo_preempt_timeout_rc(struct gk20a *g, u32 id,
2725 unsigned int id_type) 2725 unsigned int id_type)
2726{ 2726{
2727 if (id_type == ID_TYPE_TSG) { 2727 if (id_type == ID_TYPE_TSG) {
@@ -2764,7 +2764,7 @@ int __locked_fifo_preempt(struct gk20a *g, u32 id, bool is_tsg)
2764 int ret; 2764 int ret;
2765 unsigned int id_type; 2765 unsigned int id_type;
2766 2766
2767 nvgpu_log_fn(g, "%d", id); 2767 nvgpu_log_fn(g, "id: %d is_tsg: %d", id, is_tsg);
2768 2768
2769 /* issue preempt */ 2769 /* issue preempt */
2770 gk20a_fifo_issue_preempt(g, id, is_tsg); 2770 gk20a_fifo_issue_preempt(g, id, is_tsg);
@@ -2774,10 +2774,6 @@ int __locked_fifo_preempt(struct gk20a *g, u32 id, bool is_tsg)
2774 /* wait for preempt */ 2774 /* wait for preempt */
2775 ret = g->ops.fifo.is_preempt_pending(g, id, id_type, 2775 ret = g->ops.fifo.is_preempt_pending(g, id, id_type,
2776 PREEMPT_TIMEOUT_RC); 2776 PREEMPT_TIMEOUT_RC);
2777
2778 if (ret)
2779 __locked_fifo_preempt_timeout_rc(g, id, id_type);
2780
2781 return ret; 2777 return ret;
2782} 2778}
2783 2779
@@ -2789,7 +2785,9 @@ int gk20a_fifo_preempt_channel(struct gk20a *g, u32 chid)
2789 u32 mutex_ret = 0; 2785 u32 mutex_ret = 0;
2790 u32 i; 2786 u32 i;
2791 2787
2792 nvgpu_log_fn(g, "%d", chid); 2788 nvgpu_log_fn(g, "chid: %d", chid);
2789 if (chid == FIFO_INVAL_CHANNEL_ID)
2790 return 0;
2793 2791
2794 /* we have no idea which runlist we are using. lock all */ 2792 /* we have no idea which runlist we are using. lock all */
2795 for (i = 0; i < g->fifo.max_runlists; i++) 2793 for (i = 0; i < g->fifo.max_runlists; i++)
@@ -2805,6 +2803,9 @@ int gk20a_fifo_preempt_channel(struct gk20a *g, u32 chid)
2805 for (i = 0; i < g->fifo.max_runlists; i++) 2803 for (i = 0; i < g->fifo.max_runlists; i++)
2806 nvgpu_mutex_release(&f->runlist_info[i].runlist_lock); 2804 nvgpu_mutex_release(&f->runlist_info[i].runlist_lock);
2807 2805
2806 if (ret)
2807 gk20a_fifo_preempt_timeout_rc(g, chid, false);
2808
2808 return ret; 2809 return ret;
2809} 2810}
2810 2811
@@ -2816,7 +2817,9 @@ int gk20a_fifo_preempt_tsg(struct gk20a *g, u32 tsgid)
2816 u32 mutex_ret = 0; 2817 u32 mutex_ret = 0;
2817 u32 i; 2818 u32 i;
2818 2819
2819 nvgpu_log_fn(g, "%d", tsgid); 2820 nvgpu_log_fn(g, "tsgid: %d", tsgid);
2821 if (tsgid == FIFO_INVAL_TSG_ID)
2822 return 0;
2820 2823
2821 /* we have no idea which runlist we are using. lock all */ 2824 /* we have no idea which runlist we are using. lock all */
2822 for (i = 0; i < g->fifo.max_runlists; i++) 2825 for (i = 0; i < g->fifo.max_runlists; i++)
@@ -2832,6 +2835,9 @@ int gk20a_fifo_preempt_tsg(struct gk20a *g, u32 tsgid)
2832 for (i = 0; i < g->fifo.max_runlists; i++) 2835 for (i = 0; i < g->fifo.max_runlists; i++)
2833 nvgpu_mutex_release(&f->runlist_info[i].runlist_lock); 2836 nvgpu_mutex_release(&f->runlist_info[i].runlist_lock);
2834 2837
2838 if (ret)
2839 gk20a_fifo_preempt_timeout_rc(g, tsgid, true);
2840
2835 return ret; 2841 return ret;
2836} 2842}
2837 2843