gpu: nvgpu: fix buddy_allocator_init size=0 bug

Previously initializing buddy_allocator with size=0 initialized large
memory block. With fixes in buddy_allocator_init() function, size = 0
triggered segmentation fault and so size was temporarily updated to
fixed value.

This patch updates buddy_allocator_init() function to return error if
requested size of buddy_allocator is zero. As kernel VMA is absent for
VGPU, this patch also updates nvgpu_vm_do_init() function to not
allocate kernel VMA with size = 0.

Jira NVGPU-3005

Change-Id: I568fbbff6ac2c66395d1dc5a4b35304c7f4002fb
Signed-off-by: Vedashree Vidwans <vvidwans@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/2113190
Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com>
Reviewed-by: svc-mobile-misra <svc-mobile-misra@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Alex Waterman <alexw@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
Vedashree Vidwans
2019-05-24 12:57:10 -07:00
committed by mobile promotions
parent a4a7366d8d
commit cfd6d0a97c
2 changed files with 19 additions and 17 deletions

View File

@@ -1325,10 +1325,8 @@ int nvgpu_buddy_allocator_init(struct gk20a *g, struct nvgpu_allocator *na,
return -EINVAL; return -EINVAL;
} }
/* Needs to be fixed, return -EINVAL*/
if (size == 0U) { if (size == 0U) {
/* Setting to fixed size 1G to avoid further issues */ return -EINVAL;
size = 0x40000000;
} }
/* If this is to manage a GVA space we need a VM. */ /* If this is to manage a GVA space we need a VM. */

View File

@@ -503,15 +503,18 @@ int nvgpu_vm_do_init(struct mm_gk20a *mm,
} }
/* /*
* Kernel VMA. Must always exist for an address space. * Kernel VMA.
* Note: Kernel VMA does not exist for VGPU.
*/ */
if (kernel_vma_start < kernel_vma_limit) {
(void) strcpy(alloc_name, "gk20a_"); (void) strcpy(alloc_name, "gk20a_");
(void) strcat(alloc_name, name); (void) strcat(alloc_name, name);
(void) strcat(alloc_name, "-sys"); (void) strcat(alloc_name, "-sys");
err = nvgpu_allocator_init(g, &vm->kernel, err = nvgpu_allocator_init(g, &vm->kernel,
vm, alloc_name, vm, alloc_name,
kernel_vma_start, kernel_vma_start,
kernel_vma_limit - kernel_vma_start, kernel_vma_limit -
kernel_vma_start,
SZ_4K, SZ_4K,
GPU_BALLOC_MAX_ORDER, GPU_BALLOC_MAX_ORDER,
kernel_vma_flags, kernel_vma_flags,
@@ -519,6 +522,7 @@ int nvgpu_vm_do_init(struct mm_gk20a *mm,
if (err != 0) { if (err != 0) {
goto clean_up_allocators; goto clean_up_allocators;
} }
}
vm->mapped_buffers = NULL; vm->mapped_buffers = NULL;