From c03ccd89c24572dcb65bdfc8d9ab5eb76da28c96 Mon Sep 17 00:00:00 2001 From: Alex Waterman Date: Wed, 13 Sep 2017 14:03:34 -0700 Subject: gpu: nvgpu: Add nvgpu_mem_is_valid() call Add a function to check if an nvgpu_mem is allocated (valid) or not. Also fix possibly leaked state in nvgpu_mems when they fail to allocate. Also ensure that in the case of a failure to allocate no state is accidentally leaked to the caller. This should hopefully make it less likely that a caller thinks a buffer that failed to allocate is actually allocated. Change-Id: I43224ece7da84e63b2f43f36f04941126fabf3c7 Signed-off-by: Alex Waterman Reviewed-on: https://git-master.nvidia.com/r/1559419 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: svc-mobile-coverity Reviewed-by: svccoveritychecker GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom --- drivers/gpu/nvgpu/common/linux/dma.c | 2 ++ drivers/gpu/nvgpu/include/nvgpu/nvgpu_mem.h | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/gpu/nvgpu/common/linux/dma.c b/drivers/gpu/nvgpu/common/linux/dma.c index 13c1c347..43009fca 100644 --- a/drivers/gpu/nvgpu/common/linux/dma.c +++ b/drivers/gpu/nvgpu/common/linux/dma.c @@ -167,6 +167,7 @@ fail_free: dma_free_coherent(d, size, mem->cpu_va, iova); mem->cpu_va = NULL; mem->priv.sgt = NULL; + mem->size = 0; return err; } @@ -253,6 +254,7 @@ fail_kfree: nvgpu_kfree(g, mem->priv.sgt); fail_physfree: nvgpu_free(&g->mm.vidmem.allocator, addr); + mem->size = 0; return err; #else return -ENOSYS; diff --git a/drivers/gpu/nvgpu/include/nvgpu/nvgpu_mem.h b/drivers/gpu/nvgpu/include/nvgpu/nvgpu_mem.h index f3be65c2..a112623e 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/nvgpu_mem.h +++ b/drivers/gpu/nvgpu/include/nvgpu/nvgpu_mem.h @@ -39,7 +39,7 @@ struct nvgpu_gmmu_attrs; * memory actually was allocated from. */ enum nvgpu_aperture { - APERTURE_INVALID, /* unallocated or N/A */ + APERTURE_INVALID = 0, /* unallocated or N/A */ APERTURE_SYSMEM, APERTURE_VIDMEM }; @@ -122,6 +122,24 @@ static inline const char *nvgpu_aperture_str(enum nvgpu_aperture aperture) return "UNKNOWN"; } +/* + * Returns true if the passed nvgpu_mem has been allocated (i.e it's valid for + * subsequent use). + */ +static inline bool nvgpu_mem_is_valid(struct nvgpu_mem *mem) +{ + /* + * Internally the DMA APIs must set/unset the aperture flag when + * allocating/freeing the buffer. So check that to see if the *mem + * has been allocated or not. + * + * This relies on mem_descs being zeroed before being initialized since + * APERTURE_INVALID is equal to 0. + */ + return mem->aperture != APERTURE_INVALID; + +} + /** * nvgpu_mem_create_from_mem - Create a new nvgpu_mem struct from an old one. * -- cgit v1.2.2