diff options
author | Debarshi Dutta <ddutta@nvidia.com> | 2018-09-03 01:21:02 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-09-04 10:25:45 -0400 |
commit | bac38f52cc6f2ddc435a748dd9c85f3c5d88153f (patch) | |
tree | b53198fc14aa9d470d41b5d36caee934ef8c5bbc /drivers/gpu/nvgpu/os/linux | |
parent | 16ad9f537979c5f3717fc5781b1c2fad22a76f96 (diff) |
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 <ddutta@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1811650
Reviewed-by: Deepak Nibade <dnibade@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/os/linux')
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/driver_common.c | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/module.c | 2 |
2 files changed, 3 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/os/linux/driver_common.c b/drivers/gpu/nvgpu/os/linux/driver_common.c index 16af2cb0..b81cc90c 100644 --- a/drivers/gpu/nvgpu/os/linux/driver_common.c +++ b/drivers/gpu/nvgpu/os/linux/driver_common.c | |||
@@ -65,6 +65,7 @@ static void nvgpu_init_vars(struct gk20a *g) | |||
65 | nvgpu_mutex_init(&g->poweroff_lock); | 65 | nvgpu_mutex_init(&g->poweroff_lock); |
66 | nvgpu_mutex_init(&g->ctxsw_disable_lock); | 66 | nvgpu_mutex_init(&g->ctxsw_disable_lock); |
67 | nvgpu_mutex_init(&g->tpc_pg_lock); | 67 | nvgpu_mutex_init(&g->tpc_pg_lock); |
68 | nvgpu_mutex_init(&g->clk_arb_enable_lock); | ||
68 | 69 | ||
69 | l->regs_saved = l->regs; | 70 | l->regs_saved = l->regs; |
70 | l->bar1_saved = l->bar1; | 71 | l->bar1_saved = l->bar1; |
diff --git a/drivers/gpu/nvgpu/os/linux/module.c b/drivers/gpu/nvgpu/os/linux/module.c index cb501683..d226ceeb 100644 --- a/drivers/gpu/nvgpu/os/linux/module.c +++ b/drivers/gpu/nvgpu/os/linux/module.c | |||
@@ -1310,6 +1310,8 @@ int nvgpu_remove(struct device *dev, struct class *class) | |||
1310 | if (platform->remove) | 1310 | if (platform->remove) |
1311 | platform->remove(dev); | 1311 | platform->remove(dev); |
1312 | 1312 | ||
1313 | nvgpu_mutex_destroy(&g->clk_arb_enable_lock); | ||
1314 | |||
1313 | nvgpu_log_fn(g, "removed"); | 1315 | nvgpu_log_fn(g, "removed"); |
1314 | 1316 | ||
1315 | return err; | 1317 | return err; |