From 3fb2a2e209be9167d222b08b7d61c80c76414a56 Mon Sep 17 00:00:00 2001 From: Sagar Kamble Date: Sat, 16 Jul 2022 11:24:11 +0530 Subject: [PATCH] gpu: nvgpu: track gr_ctx init state On successful obj_ctx allocation, set ctx_initialized member in gr_ctx to true and when it is true then only invoke free_gr_ctx. With this we can get rid of tsg->vm check while calling free_gr_ctx. tsg->vm will go away with multiple address spaces support in TSG. Bug 3677982 Change-Id: I4a64842411ce4ab157010808e4e8e4d5cd254a7f Signed-off-by: Sagar Kamble Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2746803 Reviewed-by: svc-mobile-coverity Reviewed-by: svc-mobile-cert Reviewed-by: svc-mobile-misra Reviewed-by: Scott Long Reviewed-by: Vaibhav Kachore GVS: Gerrit_Virtual_Submit --- drivers/gpu/nvgpu/common/fifo/tsg.c | 5 +++-- drivers/gpu/nvgpu/common/gr/ctx.c | 10 ++++++++++ drivers/gpu/nvgpu/common/gr/ctx_priv.h | 2 ++ drivers/gpu/nvgpu/common/gr/gr_setup.c | 2 ++ drivers/gpu/nvgpu/common/vgpu/gr/gr_vgpu.c | 4 +++- drivers/gpu/nvgpu/include/nvgpu/gr/ctx.h | 22 ++++++++++++++++++++++ 6 files changed, 42 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/nvgpu/common/fifo/tsg.c b/drivers/gpu/nvgpu/common/fifo/tsg.c index a6f64efe1..9b15ba78f 100644 --- a/drivers/gpu/nvgpu/common/fifo/tsg.c +++ b/drivers/gpu/nvgpu/common/fifo/tsg.c @@ -968,6 +968,7 @@ static struct nvgpu_tsg *tsg_gk20a_from_ref(struct nvgpu_ref *ref) void nvgpu_tsg_release(struct nvgpu_ref *ref) { struct nvgpu_tsg *tsg = tsg_gk20a_from_ref(ref); + struct nvgpu_gr_ctx *gr_ctx = tsg->gr_ctx; struct gk20a *g = tsg->g; int err; @@ -977,8 +978,8 @@ void nvgpu_tsg_release(struct nvgpu_ref *ref) return; } - if ((tsg->gr_ctx != NULL) && (tsg->vm != NULL)) { - g->ops.gr.setup.free_gr_ctx(g, tsg->gr_ctx); + if ((gr_ctx != NULL) && nvgpu_gr_ctx_get_ctx_initialized(gr_ctx)) { + g->ops.gr.setup.free_gr_ctx(g, gr_ctx); } #ifdef CONFIG_NVGPU_CHANNEL_TSG_CONTROL diff --git a/drivers/gpu/nvgpu/common/gr/ctx.c b/drivers/gpu/nvgpu/common/gr/ctx.c index a25793f42..541e5a234 100644 --- a/drivers/gpu/nvgpu/common/gr/ctx.c +++ b/drivers/gpu/nvgpu/common/gr/ctx.c @@ -563,6 +563,16 @@ u32 nvgpu_gr_ctx_get_tsgid(struct nvgpu_gr_ctx *gr_ctx) return gr_ctx->tsgid; } +void nvgpu_gr_ctx_mark_ctx_initialized(struct nvgpu_gr_ctx *gr_ctx) +{ + gr_ctx->ctx_initialized = true; +} + +bool nvgpu_gr_ctx_get_ctx_initialized(struct nvgpu_gr_ctx *gr_ctx) +{ + return gr_ctx->ctx_initialized; +} + #ifdef CONFIG_NVGPU_GRAPHICS void nvgpu_gr_ctx_init_graphics_preemption_mode(struct nvgpu_gr_ctx *gr_ctx, u32 graphics_preempt_mode) diff --git a/drivers/gpu/nvgpu/common/gr/ctx_priv.h b/drivers/gpu/nvgpu/common/gr/ctx_priv.h index a47228bfd..887fe4731 100644 --- a/drivers/gpu/nvgpu/common/gr/ctx_priv.h +++ b/drivers/gpu/nvgpu/common/gr/ctx_priv.h @@ -149,6 +149,8 @@ struct nvgpu_gr_ctx { */ u32 tsgid; + bool ctx_initialized; + #ifdef CONFIG_NVGPU_SM_DIVERSITY /** SM diversity configuration offset. * It is valid only if NVGPU_SUPPORT_SM_DIVERSITY support is true. diff --git a/drivers/gpu/nvgpu/common/gr/gr_setup.c b/drivers/gpu/nvgpu/common/gr/gr_setup.c index 8dd089626..3b0f0daac 100644 --- a/drivers/gpu/nvgpu/common/gr/gr_setup.c +++ b/drivers/gpu/nvgpu/common/gr/gr_setup.c @@ -267,6 +267,8 @@ int nvgpu_gr_setup_alloc_obj_ctx(struct nvgpu_channel *c, u32 class_num, } #endif + nvgpu_gr_ctx_mark_ctx_initialized(gr_ctx); + nvgpu_mutex_release(&tsg->ctx_init_lock); nvgpu_log(g, gpu_dbg_fn | gpu_dbg_gr, "done"); diff --git a/drivers/gpu/nvgpu/common/vgpu/gr/gr_vgpu.c b/drivers/gpu/nvgpu/common/vgpu/gr/gr_vgpu.c index e968413b6..c50e95720 100644 --- a/drivers/gpu/nvgpu/common/vgpu/gr/gr_vgpu.c +++ b/drivers/gpu/nvgpu/common/vgpu/gr/gr_vgpu.c @@ -233,7 +233,9 @@ int vgpu_gr_alloc_obj_ctx(struct nvgpu_channel *c, u32 class_num, u32 flags) err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg)); err = err ? err : msg.ret; - if (err) { + if (err == 0) { + nvgpu_gr_ctx_mark_ctx_initialized(gr_ctx); + } else { nvgpu_err(g, "alloc obj ctx failed err %d", err); } return err; diff --git a/drivers/gpu/nvgpu/include/nvgpu/gr/ctx.h b/drivers/gpu/nvgpu/include/nvgpu/gr/ctx.h index 7a703db57..990c68cf6 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/gr/ctx.h +++ b/drivers/gpu/nvgpu/include/nvgpu/gr/ctx.h @@ -530,6 +530,28 @@ void nvgpu_gr_ctx_set_tsgid(struct nvgpu_gr_ctx *gr_ctx, u32 tsgid); */ u32 nvgpu_gr_ctx_get_tsgid(struct nvgpu_gr_ctx *gr_ctx); +/** + * @brief Mark graphics context initialized. + * + * @param gr_ctx [in] Pointer to graphics context struct. + * + * This function will mark obj_ctx initialized for the gr_ctx by + * setting ctx_initialized to true. + */ +void nvgpu_gr_ctx_mark_ctx_initialized(struct nvgpu_gr_ctx *gr_ctx); + +/** + * @brief Get ctx_initialized stored in graphics context structure. + * + * @param gr_ctx [in] Pointer to graphics context struct. + * + * This function will return ctx_initialized stored in #nvgpu_gr_ctx + * structure. + * + * @return ctx initialization status. + */ +bool nvgpu_gr_ctx_get_ctx_initialized(struct nvgpu_gr_ctx *gr_ctx); + #ifdef CONFIG_NVGPU_CILP bool nvgpu_gr_ctx_get_cilp_preempt_pending(struct nvgpu_gr_ctx *gr_ctx);