diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2018-08-30 04:35:25 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-09-06 19:12:13 -0400 |
commit | eb473aa0b1ad2a65195950907438a0de6e53d527 (patch) | |
tree | 0eb0858a7fa84f7785031e8d202e680103291c8a /drivers/gpu/nvgpu/common | |
parent | bc1ea8c9bfdd8614af3f282a52cbb1b74c4d9544 (diff) |
gpu: nvgpu: fix crash with uninitialized comptag allocator
If gk20a_comptaglines_alloc() is called with an uninitialized comptag allocator
we right now see a kernel panic like this
[ 445.097931] [<ffffff8008fdd650>] __mutex_lock_slowpath+0xe0/0x188
[ 445.104275] [<ffffff8008fdd748>] mutex_lock+0x50/0x68
[ 445.109773] [<ffffff80012ef340>] gk20a_comptaglines_alloc+0x30/0x98 [nvgpu]
[ 445.117169] [<ffffff80012e0fdc>] gk20a_alloc_or_get_comptags+0xe4/0x140 [nvgpu]
[ 445.124910] [<ffffff80012ee1cc>] nvgpu_vm_map+0x414/0x7b8 [nvgpu]
[ 445.131433] [<ffffff80012dd754>] nvgpu_vm_map_linux+0x114/0x1e8 [nvgpu]
[ 445.138475] [<ffffff80012dd978>] nvgpu_vm_map_buffer+0x150/0x238 [nvgpu]
[ 445.145605] [<ffffff80012d2834>] gk20a_as_dev_ioctl+0x30c/0xa78 [nvgpu]
[ 445.152473] [<ffffff8008262154>] do_vfs_ioctl+0xc4/0x8f8
Fix this by checking explicitly that comptag allocator is initialized in
gk20a_comptaglines_alloc() and gk20a_comptaglines_free()
Bug 2171567
Change-Id: Iaac6d77e40a8aaa01f2bacbe0cb54ec447100075
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1805170
GVS: Gerrit_Virtual_Submit
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-by: Seshendra Gadagottu <sgadagottu@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/common')
-rw-r--r-- | drivers/gpu/nvgpu/common/mm/comptags.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/common/mm/comptags.c b/drivers/gpu/nvgpu/common/mm/comptags.c index 334236ec..3bde3a53 100644 --- a/drivers/gpu/nvgpu/common/mm/comptags.c +++ b/drivers/gpu/nvgpu/common/mm/comptags.c | |||
@@ -32,6 +32,10 @@ int gk20a_comptaglines_alloc(struct gk20a_comptag_allocator *allocator, | |||
32 | unsigned long addr; | 32 | unsigned long addr; |
33 | int err = 0; | 33 | int err = 0; |
34 | 34 | ||
35 | if (allocator->size == 0UL) { | ||
36 | return -EINVAL; | ||
37 | } | ||
38 | |||
35 | nvgpu_mutex_acquire(&allocator->lock); | 39 | nvgpu_mutex_acquire(&allocator->lock); |
36 | addr = bitmap_find_next_zero_area(allocator->bitmap, allocator->size, | 40 | addr = bitmap_find_next_zero_area(allocator->bitmap, allocator->size, |
37 | 0, len, 0); | 41 | 0, len, 0); |
@@ -53,6 +57,10 @@ void gk20a_comptaglines_free(struct gk20a_comptag_allocator *allocator, | |||
53 | /* number zero is reserved; bitmap base is 1 */ | 57 | /* number zero is reserved; bitmap base is 1 */ |
54 | u32 addr = offset - 1U; | 58 | u32 addr = offset - 1U; |
55 | 59 | ||
60 | if (allocator->size == 0UL) { | ||
61 | return; | ||
62 | } | ||
63 | |||
56 | WARN_ON(offset == 0U); | 64 | WARN_ON(offset == 0U); |
57 | WARN_ON(addr > allocator->size); | 65 | WARN_ON(addr > allocator->size); |
58 | WARN_ON(addr + len > allocator->size); | 66 | WARN_ON(addr + len > allocator->size); |