diff options
author | Yogesh <ybhosale@nvidia.com> | 2015-07-31 00:02:11 -0400 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2015-08-12 18:29:03 -0400 |
commit | 77e608d528b85d9b63bef90606afbcd8504e16d1 (patch) | |
tree | 7c19b6260dbb014e07f16818b498ccfc17397580 /drivers/gpu/nvgpu | |
parent | 9cf28bc529684d58f4b61a7637f16879098cbcc4 (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')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 26 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | 3 |
2 files changed, 17 insertions, 12 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 | } |
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c index de44f925..77c5da0a 100644 --- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | |||
@@ -2286,7 +2286,8 @@ void gk20a_remove_pmu_support(struct pmu_gk20a *pmu) | |||
2286 | { | 2286 | { |
2287 | gk20a_dbg_fn(""); | 2287 | gk20a_dbg_fn(""); |
2288 | 2288 | ||
2289 | gk20a_allocator_destroy(&pmu->dmem); | 2289 | if (pmu->dmem.init) |
2290 | gk20a_allocator_destroy(&pmu->dmem); | ||
2290 | } | 2291 | } |
2291 | 2292 | ||
2292 | static int gk20a_init_pmu_reset_enable_hw(struct gk20a *g) | 2293 | static int gk20a_init_pmu_reset_enable_hw(struct gk20a *g) |