diff options
author | Konsta Holtta <kholtta@nvidia.com> | 2014-12-08 05:07:10 -0500 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:12:31 -0400 |
commit | 31f47b8306232565b60d43d7d974699faa997cf3 (patch) | |
tree | df05c0101558a5a4159476b19acd9a6af1fc9615 /drivers | |
parent | d7988e581f1ef9015c0d8125e96ad91570c9d591 (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')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/cde_gk20a.c | 12 |
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)); |