summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/common/mm
diff options
context:
space:
mode:
authorNitin Kumbhar <nkumbhar@nvidia.com>2018-05-25 06:54:27 -0400
committerTejal Kudav <tkudav@nvidia.com>2018-06-14 09:44:06 -0400
commitf9da1781f67b1c67f4c0825dae38dfc13e72bbc1 (patch)
tree5ae507a74ce945cb4e58be545b20691019626e04 /drivers/gpu/nvgpu/common/mm
parentd84e822128a224eda4a703dad530716331dd36bd (diff)
gpu: nvgpu: skip destroy if vidmem not initialized
The vidmem shall be destroyed only if it has been initialized. If not skipped, it accesses mutexes which are in invalid state. This results in BUG like: BUG: spinlock bad magic on CPU#0, rmmod/1560 Also, destroy vidmem bootstrap allocator which is set up in nvgpu_vidmem_init(). Bug 1987855 Change-Id: I68e91422a54b40feeb9071158b797828e2391303 Signed-off-by: Nitin Kumbhar <nkumbhar@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1730535 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com> Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/common/mm')
-rw-r--r--drivers/gpu/nvgpu/common/mm/vidmem.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/gpu/nvgpu/common/mm/vidmem.c b/drivers/gpu/nvgpu/common/mm/vidmem.c
index 37435f97..b6e1919f 100644
--- a/drivers/gpu/nvgpu/common/mm/vidmem.c
+++ b/drivers/gpu/nvgpu/common/mm/vidmem.c
@@ -39,6 +39,14 @@
39void nvgpu_vidmem_destroy(struct gk20a *g) 39void nvgpu_vidmem_destroy(struct gk20a *g)
40{ 40{
41 struct nvgpu_timeout timeout; 41 struct nvgpu_timeout timeout;
42 size_t size;
43
44 size = g->ops.mm.get_vidmem_size ?
45 g->ops.mm.get_vidmem_size(g) : 0;
46
47 /* Nothing to destroy if no vidmem */
48 if (!size)
49 return;
42 50
43 nvgpu_timeout_init(g, &timeout, 100, NVGPU_TIMER_RETRY_TIMER); 51 nvgpu_timeout_init(g, &timeout, 100, NVGPU_TIMER_RETRY_TIMER);
44 52
@@ -73,6 +81,9 @@ void nvgpu_vidmem_destroy(struct gk20a *g)
73 81
74 if (nvgpu_alloc_initialized(&g->mm.vidmem.allocator)) 82 if (nvgpu_alloc_initialized(&g->mm.vidmem.allocator))
75 nvgpu_alloc_destroy(&g->mm.vidmem.allocator); 83 nvgpu_alloc_destroy(&g->mm.vidmem.allocator);
84
85 if (nvgpu_alloc_initialized(&g->mm.vidmem.bootstrap_allocator))
86 nvgpu_alloc_destroy(&g->mm.vidmem.bootstrap_allocator);
76} 87}
77 88
78static int __nvgpu_vidmem_do_clear_all(struct gk20a *g) 89static int __nvgpu_vidmem_do_clear_all(struct gk20a *g)
@@ -297,15 +308,16 @@ static int nvgpu_vidmem_clear_pending_allocs_thr(void *mm_ptr)
297int nvgpu_vidmem_init(struct mm_gk20a *mm) 308int nvgpu_vidmem_init(struct mm_gk20a *mm)
298{ 309{
299 struct gk20a *g = mm->g; 310 struct gk20a *g = mm->g;
300 size_t size = g->ops.mm.get_vidmem_size ?
301 g->ops.mm.get_vidmem_size(g) : 0;
302 u64 bootstrap_base, bootstrap_size, base; 311 u64 bootstrap_base, bootstrap_size, base;
303 u64 default_page_size = SZ_64K; 312 u64 default_page_size = SZ_64K;
313 size_t size;
304 int err; 314 int err;
305 315
306 static struct nvgpu_alloc_carveout wpr_co = 316 static struct nvgpu_alloc_carveout wpr_co =
307 NVGPU_CARVEOUT("wpr-region", 0, SZ_16M); 317 NVGPU_CARVEOUT("wpr-region", 0, SZ_16M);
308 318
319 size = g->ops.mm.get_vidmem_size ?
320 g->ops.mm.get_vidmem_size(g) : 0;
309 if (!size) 321 if (!size)
310 return 0; 322 return 0;
311 323