From 31f47b8306232565b60d43d7d974699faa997cf3 Mon Sep 17 00:00:00 2001 From: Konsta Holtta Date: Mon, 8 Dec 2014 12:07:10 +0200 Subject: 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 (cherry-picked from commit f56a941b4962c5479291cae48e2abca6067e3f13) Reviewed-on: http://git-master/r/660849 Reviewed-by: Terje Bergstrom Tested-by: Terje Bergstrom --- drivers/gpu/nvgpu/gk20a/cde_gk20a.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/cde_gk20a.c') 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) mutex_lock(&cde_app->mutex); - WARN(!cde_ctx->in_use, "double release cde context %p", cde_ctx); + if (!cde_ctx->in_use) + gk20a_dbg_info("double release cde context %p", cde_ctx); cde_ctx->in_use = false; list_move(&cde_ctx->list, &cde_app->free_contexts); @@ -1073,8 +1074,9 @@ __releases(&cde_app->mutex) trace_gk20a_cde_finished_ctx_cb(cde_ctx); gk20a_dbg(gpu_dbg_fn | gpu_dbg_cde_ctx, "cde: finished %p", cde_ctx); - WARN(!cde_ctx->in_use, "double finish cde context %p on channel %p", - cde_ctx, ch); + if (!cde_ctx->in_use) + gk20a_dbg_info("double finish cde context %p on channel %p", + cde_ctx, ch); if (ch->has_timedout) { if (cde_ctx->is_temporary) { @@ -1097,8 +1099,8 @@ __releases(&cde_app->mutex) } } - /* delete temporary contexts later */ - if (cde_ctx->is_temporary) { + /* delete temporary contexts later (watch for doubles) */ + if (cde_ctx->is_temporary && cde_ctx->in_use) { WARN_ON(delayed_work_pending(&cde_ctx->ctx_deleter_work)); schedule_delayed_work(&cde_ctx->ctx_deleter_work, msecs_to_jiffies(CTX_DELETE_TIME)); -- cgit v1.2.2