summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
diff options
context:
space:
mode:
authorYogesh <ybhosale@nvidia.com>2015-07-31 00:02:11 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2015-08-12 18:29:03 -0400
commit77e608d528b85d9b63bef90606afbcd8504e16d1 (patch)
tree7c19b6260dbb014e07f16818b498ccfc17397580 /drivers/gpu/nvgpu/gk20a/mm_gk20a.c
parent9cf28bc529684d58f4b61a7637f16879098cbcc4 (diff)
gpu: nvgpu: Check for valid memory pointers
1. Before destroying the allocator for PMU dmem check if it was already initialized. It is only initialized through certain paths like PMU ISRs. So while testing the nvgpu module using nvgpu_submit_twod test I found that it was never initialized. 2. Inside gk20a_init_gr_setup_sw, cleanup part calls for de-allocating the already allocated chunk of memory. Whereas, cleanup also gets called when memory allocation inside the same function fails. In such cases, we should have a non-null check else we attempt to free a non-allocated memory and kernel panics. Bug 1476801 Change-Id: Ia2f0599ac0c35d58709acd149033e114b898b426 Signed-off-by: Yogesh Bhosale <ybhosale@nvidia.com> Reviewed-on: http://git-master/r/777118 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
index 32ccc5b8..b12091bf 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
@@ -1898,19 +1898,23 @@ void gk20a_gmmu_free_attr(struct gk20a *g, enum dma_attr attr,
1898 if (attr) { 1898 if (attr) {
1899 DEFINE_DMA_ATTRS(attrs); 1899 DEFINE_DMA_ATTRS(attrs);
1900 dma_set_attr(attr, &attrs); 1900 dma_set_attr(attr, &attrs);
1901 if (attr == DMA_ATTR_NO_KERNEL_MAPPING) 1901 if (attr == DMA_ATTR_NO_KERNEL_MAPPING) {
1902 dma_free_attrs(d, mem->size, mem->pages, 1902 if (mem->pages)
1903 sg_dma_address(mem->sgt->sgl), 1903 dma_free_attrs(d, mem->size, mem->pages,
1904 &attrs); 1904 sg_dma_address(mem->sgt->sgl),
1905 else 1905 &attrs);
1906 dma_free_attrs(d, mem->size, mem->cpu_va, 1906 } else {
1907 sg_dma_address(mem->sgt->sgl), 1907 if (mem->cpu_va)
1908 &attrs); 1908 dma_free_attrs(d, mem->size,
1909 mem->cpu_va,
1910 sg_dma_address(mem->sgt->sgl),
1911 &attrs);
1912 }
1909 } else { 1913 } else {
1910 dma_free_coherent(d, mem->size, mem->cpu_va, 1914 if (mem->cpu_va)
1911 sg_dma_address(mem->sgt->sgl)); 1915 dma_free_coherent(d, mem->size, mem->cpu_va,
1916 sg_dma_address(mem->sgt->sgl));
1912 } 1917 }
1913
1914 mem->cpu_va = NULL; 1918 mem->cpu_va = NULL;
1915 mem->pages = NULL; 1919 mem->pages = NULL;
1916 } 1920 }