diff --git a/drivers/gpu/nvgpu/common/linux/dma.c b/drivers/gpu/nvgpu/common/linux/dma.c index 13c1c3471..43009fcae 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 f3be65c21..a112623e0 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. *