summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/cde_gk20a.c
diff options
context:
space:
mode:
authorKonsta Holtta <kholtta@nvidia.com>2014-12-08 05:07:10 -0500
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:12:31 -0400
commit31f47b8306232565b60d43d7d974699faa997cf3 (patch)
treedf05c0101558a5a4159476b19acd9a6af1fc9615 /drivers/gpu/nvgpu/gk20a/cde_gk20a.c
parentd7988e581f1ef9015c0d8125e96ad91570c9d591 (diff)
gpu: nvgpu: cde: allow duplicate finish signals
Channel update callback for a channel that has no more cde jobs signals that a cde context is free. Spurious channel updates may still happen from at least nonstalling semaphore wait interrupts. Instead of scary WARNs, use only gk20a_dbg_info() for info prints in these harmless situations, and double check that only the first update starts a deleter work for temporary contexts. Change-Id: I68de8f35e2c366206c6efac3ee97025239e8bba2 Signed-off-by: Konsta Holtta <kholtta@nvidia.com> (cherry-picked from commit f56a941b4962c5479291cae48e2abca6067e3f13) Reviewed-on: http://git-master/r/660849 Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/cde_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/cde_gk20a.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/cde_gk20a.c b/drivers/gpu/nvgpu/gk20a/cde_gk20a.c
index d2384257..f3185dd9 100644
--- a/drivers/gpu/nvgpu/gk20a/cde_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/cde_gk20a.c
@@ -759,7 +759,8 @@ __releases(&cde_app->mutex)
759 759
760 mutex_lock(&cde_app->mutex); 760 mutex_lock(&cde_app->mutex);
761 761
762 WARN(!cde_ctx->in_use, "double release cde context %p", cde_ctx); 762 if (!cde_ctx->in_use)
763 gk20a_dbg_info("double release cde context %p", cde_ctx);
763 764
764 cde_ctx->in_use = false; 765 cde_ctx->in_use = false;
765 list_move(&cde_ctx->list, &cde_app->free_contexts); 766 list_move(&cde_ctx->list, &cde_app->free_contexts);
@@ -1073,8 +1074,9 @@ __releases(&cde_app->mutex)
1073 1074
1074 trace_gk20a_cde_finished_ctx_cb(cde_ctx); 1075 trace_gk20a_cde_finished_ctx_cb(cde_ctx);
1075 gk20a_dbg(gpu_dbg_fn | gpu_dbg_cde_ctx, "cde: finished %p", cde_ctx); 1076 gk20a_dbg(gpu_dbg_fn | gpu_dbg_cde_ctx, "cde: finished %p", cde_ctx);
1076 WARN(!cde_ctx->in_use, "double finish cde context %p on channel %p", 1077 if (!cde_ctx->in_use)
1077 cde_ctx, ch); 1078 gk20a_dbg_info("double finish cde context %p on channel %p",
1079 cde_ctx, ch);
1078 1080
1079 if (ch->has_timedout) { 1081 if (ch->has_timedout) {
1080 if (cde_ctx->is_temporary) { 1082 if (cde_ctx->is_temporary) {
@@ -1097,8 +1099,8 @@ __releases(&cde_app->mutex)
1097 } 1099 }
1098 } 1100 }
1099 1101
1100 /* delete temporary contexts later */ 1102 /* delete temporary contexts later (watch for doubles) */
1101 if (cde_ctx->is_temporary) { 1103 if (cde_ctx->is_temporary && cde_ctx->in_use) {
1102 WARN_ON(delayed_work_pending(&cde_ctx->ctx_deleter_work)); 1104 WARN_ON(delayed_work_pending(&cde_ctx->ctx_deleter_work));
1103 schedule_delayed_work(&cde_ctx->ctx_deleter_work, 1105 schedule_delayed_work(&cde_ctx->ctx_deleter_work,
1104 msecs_to_jiffies(CTX_DELETE_TIME)); 1106 msecs_to_jiffies(CTX_DELETE_TIME));