diff options
author | Nitin Kumbhar <nkumbhar@nvidia.com> | 2018-05-25 06:54:27 -0400 |
---|---|---|
committer | Tejal Kudav <tkudav@nvidia.com> | 2018-06-14 09:44:06 -0400 |
commit | f9da1781f67b1c67f4c0825dae38dfc13e72bbc1 (patch) | |
tree | 5ae507a74ce945cb4e58be545b20691019626e04 | |
parent | d84e822128a224eda4a703dad530716331dd36bd (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>
-rw-r--r-- | drivers/gpu/nvgpu/common/mm/vidmem.c | 16 |
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 @@ | |||
39 | void nvgpu_vidmem_destroy(struct gk20a *g) | 39 | void 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 | ||
78 | static int __nvgpu_vidmem_do_clear_all(struct gk20a *g) | 89 | static int __nvgpu_vidmem_do_clear_all(struct gk20a *g) |
@@ -297,15 +308,16 @@ static int nvgpu_vidmem_clear_pending_allocs_thr(void *mm_ptr) | |||
297 | int nvgpu_vidmem_init(struct mm_gk20a *mm) | 308 | int 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 | ||