From bac38f52cc6f2ddc435a748dd9c85f3c5d88153f Mon Sep 17 00:00:00 2001 From: Debarshi Dutta Date: Mon, 3 Sep 2018 10:51:02 +0530 Subject: gpu: nvgpu: protect clk_arb init with mutex. g->clk_arb is currently initialized as a part of gk20a_finalize_poweron(). Any subsequent call to gk20a_finalize_poweron reinitializes the clk_arb and leading to memory leaks. This is resolved by protecting the g->clk_arb initialization with a mutex clk_arb_enable_lock in struct gk20a. We skip initializing the g->clk_arb if its not NULL. Bug 2061372 Change-Id: I59158e0a5e4c827fdbd6d9ea2d04c78d0986347a Signed-off-by: Debarshi Dutta Reviewed-on: https://git-master.nvidia.com/r/1811650 Reviewed-by: Deepak Nibade GVS: Gerrit_Virtual_Submit Reviewed-by: Vijayakumar Subbu Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/clk/clk_arb.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'drivers/gpu/nvgpu/clk/clk_arb.c') diff --git a/drivers/gpu/nvgpu/clk/clk_arb.c b/drivers/gpu/nvgpu/clk/clk_arb.c index 983a82f9..8543196b 100644 --- a/drivers/gpu/nvgpu/clk/clk_arb.c +++ b/drivers/gpu/nvgpu/clk/clk_arb.c @@ -750,12 +750,20 @@ error_check: int nvgpu_clk_arb_init_arbiter(struct gk20a *g) { + int err = 0; + if (!g->ops.clk.support_clk_freq_controller || !g->ops.clk_arb.get_arbiter_clk_domains) { return 0; } - return g->ops.clk_arb.arbiter_clk_init(g); + nvgpu_mutex_acquire(&g->clk_arb_enable_lock); + + err = g->ops.clk_arb.arbiter_clk_init(g); + + nvgpu_mutex_release(&g->clk_arb_enable_lock); + + return err; } void nvgpu_clk_arb_send_thermal_alarm(struct gk20a *g) @@ -783,10 +791,14 @@ void nvgpu_clk_arb_cleanup_arbiter(struct gk20a *g) { struct nvgpu_clk_arb *arb = g->clk_arb; + nvgpu_mutex_acquire(&g->clk_arb_enable_lock); + if (arb) { nvgpu_clk_arb_worker_deinit(g); g->ops.clk_arb.clk_arb_cleanup(g->clk_arb); } + + nvgpu_mutex_release(&g->clk_arb_enable_lock); } int nvgpu_clk_arb_init_session(struct gk20a *g, -- cgit v1.2.2