summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu
diff options
context:
space:
mode:
authorKonsta Holtta <kholtta@nvidia.com>2014-11-17 10:37:35 -0500
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:12:16 -0400
commite22d0082ec96864c0689848945f6c41a5f1419af (patch)
tree1d19e48deea8a624e286308f5c2558866ee878f8 /drivers/gpu/nvgpu
parent617541236b2dcf980f7c9e3c6441472f1cc7bf62 (diff)
gpu: nvgpu: cde: wait for ctx deletion before get
Wait for possible temp context deletion to finish properly before passing contexts around later, to prevent situations where the context deleter scheduling would have been completed, but running it would not, and a new one could have been scheduled again. When finished, schedule the deleter before freeing the context back to use to prevent races. Warn in impossible situations when these double deletions would happen. Bug 200054186 Bug 200052943 Change-Id: I23ca0d1081eea77d0e453b9038adc914909b5f48 Signed-off-by: Konsta Holtta <kholtta@nvidia.com> Reviewed-on: http://git-master/r/603439 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r--drivers/gpu/nvgpu/gk20a/cde_gk20a.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/cde_gk20a.c b/drivers/gpu/nvgpu/gk20a/cde_gk20a.c
index 24c28029..f4ddc02e 100644
--- a/drivers/gpu/nvgpu/gk20a/cde_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/cde_gk20a.c
@@ -816,7 +816,9 @@ __releases(&cde_app->mutex)
816 cde_ctx); 816 cde_ctx);
817 goto out; 817 goto out;
818 } 818 }
819 cde_ctx->in_use = true; 819
820 WARN(delayed_work_pending(&cde_ctx->ctx_deleter_work),
821 "double pending %p", cde_ctx);
820 822
821 gk20a_cde_remove_ctx(cde_ctx); 823 gk20a_cde_remove_ctx(cde_ctx);
822 gk20a_dbg(gpu_dbg_fn | gpu_dbg_cde_ctx, 824 gk20a_dbg(gpu_dbg_fn | gpu_dbg_cde_ctx,
@@ -858,8 +860,7 @@ __must_hold(&cde_app->mutex)
858 cde_app->ctx_usecount++; 860 cde_app->ctx_usecount++;
859 861
860 /* cancel any deletions now that ctx is in use */ 862 /* cancel any deletions now that ctx is in use */
861 if (delayed_work_pending(&cde_ctx->ctx_deleter_work)) 863 gk20a_cde_cancel_deleter(cde_ctx, true);
862 gk20a_cde_cancel_deleter(cde_ctx, false);
863 return cde_ctx; 864 return cde_ctx;
864 } 865 }
865 866
@@ -1108,14 +1109,17 @@ __releases(&cde_app->mutex)
1108 } 1109 }
1109 mutex_unlock(&cde_app->mutex); 1110 mutex_unlock(&cde_app->mutex);
1110 } 1111 }
1111 } else {
1112 gk20a_cde_ctx_release(cde_ctx);
1113 } 1112 }
1114 1113
1115 /* delete temporary contexts later */ 1114 /* delete temporary contexts later */
1116 if (cde_ctx->is_temporary) 1115 if (cde_ctx->is_temporary) {
1116 WARN_ON(delayed_work_pending(&cde_ctx->ctx_deleter_work));
1117 schedule_delayed_work(&cde_ctx->ctx_deleter_work, 1117 schedule_delayed_work(&cde_ctx->ctx_deleter_work,
1118 msecs_to_jiffies(CTX_DELETE_TIME)); 1118 msecs_to_jiffies(CTX_DELETE_TIME));
1119 }
1120
1121 if (!ch->has_timedout)
1122 gk20a_cde_ctx_release(cde_ctx);
1119} 1123}
1120 1124
1121static int gk20a_cde_load(struct gk20a_cde_ctx *cde_ctx) 1125static int gk20a_cde_load(struct gk20a_cde_ctx *cde_ctx)