From 90925a739ab80a93c6a325c12a61752c24339089 Mon Sep 17 00:00:00 2001 From: Konsta Holtta Date: Thu, 22 Mar 2018 18:25:05 +0200 Subject: gpu: nvgpu: check sema pool alloc failure properly nvgpu_semaphore_pool_alloc() returns an ERR_PTR instead of NULL which the caller checks on failure. Common code should not use ERR_PTRs though, so modify nvgpu_semaphore_pool_alloc() to return error code separately and fix nvgpu_init_sema_pool() to consider this. Jira NVGPU-513 Change-Id: I435c0d2794d226774ed4c6b3bcbdde1e741854d8 Signed-off-by: Konsta Holtta Reviewed-on: https://git-master.nvidia.com/r/1673458 Reviewed-by: svc-mobile-coverity Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Deepak Nibade Reviewed-by: Terje Bergstrom Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/mm/vm.c | 6 +++--- drivers/gpu/nvgpu/common/semaphore.c | 21 ++++++++++----------- drivers/gpu/nvgpu/include/nvgpu/semaphore.h | 4 ++-- 3 files changed, 15 insertions(+), 16 deletions(-) (limited to 'drivers') diff --git a/drivers/gpu/nvgpu/common/mm/vm.c b/drivers/gpu/nvgpu/common/mm/vm.c index f57b1c9c..13fd641e 100644 --- a/drivers/gpu/nvgpu/common/mm/vm.c +++ b/drivers/gpu/nvgpu/common/mm/vm.c @@ -230,9 +230,9 @@ static int nvgpu_init_sema_pool(struct vm_gk20a *vm) if (!sema_sea) return -ENOMEM; - vm->sema_pool = nvgpu_semaphore_pool_alloc(sema_sea); - if (!vm->sema_pool) - return -ENOMEM; + err = nvgpu_semaphore_pool_alloc(sema_sea, &vm->sema_pool); + if (err) + return err; /* * Allocate a chunk of GPU VA space for mapping the semaphores. We will diff --git a/drivers/gpu/nvgpu/common/semaphore.c b/drivers/gpu/nvgpu/common/semaphore.c index b2238bb7..fe4131c3 100644 --- a/drivers/gpu/nvgpu/common/semaphore.c +++ b/drivers/gpu/nvgpu/common/semaphore.c @@ -146,29 +146,27 @@ static int __semaphore_bitmap_alloc(unsigned long *bitmap, unsigned long len) /* * Allocate a pool from the sea. */ -struct nvgpu_semaphore_pool *nvgpu_semaphore_pool_alloc( - struct nvgpu_semaphore_sea *sea) +int nvgpu_semaphore_pool_alloc(struct nvgpu_semaphore_sea *sea, + struct nvgpu_semaphore_pool **pool) { struct nvgpu_semaphore_pool *p; unsigned long page_idx; - int ret, err = 0; + int ret; p = nvgpu_kzalloc(sea->gk20a, sizeof(*p)); if (!p) - return ERR_PTR(-ENOMEM); + return -ENOMEM; __lock_sema_sea(sea); - err = nvgpu_mutex_init(&p->pool_lock); - if (err) + ret = nvgpu_mutex_init(&p->pool_lock); + if (ret) goto fail; ret = __semaphore_bitmap_alloc(sea->pools_alloced, SEMAPHORE_POOL_COUNT); - if (ret < 0) { - err = ret; + if (ret < 0) goto fail_alloc; - } page_idx = (unsigned long)ret; @@ -184,7 +182,8 @@ struct nvgpu_semaphore_pool *nvgpu_semaphore_pool_alloc( gpu_sema_dbg(sea->gk20a, "Allocated semaphore pool: page-idx=%d", p->page_idx); - return p; + *pool = p; + return 0; fail_alloc: nvgpu_mutex_destroy(&p->pool_lock); @@ -192,7 +191,7 @@ fail: __unlock_sema_sea(sea); nvgpu_kfree(sea->gk20a, p); gpu_sema_dbg(sea->gk20a, "Failed to allocate semaphore pool!"); - return ERR_PTR(err); + return ret; } /* diff --git a/drivers/gpu/nvgpu/include/nvgpu/semaphore.h b/drivers/gpu/nvgpu/include/nvgpu/semaphore.h index e66b2188..771cc7e1 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/semaphore.h +++ b/drivers/gpu/nvgpu/include/nvgpu/semaphore.h @@ -173,8 +173,8 @@ struct nvgpu_semaphore_sea *nvgpu_semaphore_get_sea(struct gk20a *g); /* * Semaphore pool functions. */ -struct nvgpu_semaphore_pool *nvgpu_semaphore_pool_alloc( - struct nvgpu_semaphore_sea *sea); +int nvgpu_semaphore_pool_alloc(struct nvgpu_semaphore_sea *sea, + struct nvgpu_semaphore_pool **pool); int nvgpu_semaphore_pool_map(struct nvgpu_semaphore_pool *pool, struct vm_gk20a *vm); void nvgpu_semaphore_pool_unmap(struct nvgpu_semaphore_pool *pool, -- cgit v1.2.2