summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonsta Holtta <kholtta@nvidia.com>2018-09-11 07:47:42 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2019-08-15 03:58:44 -0400
commit758cb76e225775ba5ac3dd2cb9415cb40dc83810 (patch)
treeeabe117181e73f9ff8c7872b6ee20877416bd5b7
parent44c23acfa4453d7f5773a8adc288358bc3f3b425 (diff)
gpu: nvgpu: add FOREIGN_SGT mem flag
Add an internal flag NVGPU_MEM_FLAG_FOREIGN_SGT to specify that the sgt member of an nvgpu_mem must not be freed when the nvgpu_mem is freed. Bug 200145225 Bug 200541476 Change-Id: I044fb91a5f9d148f38fb0cbf63d0cdfd64a070ce Signed-off-by: Konsta Holtta <kholtta@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1819801 Signed-off-by: Debarshi Dutta <ddutta@nvidia.com> (cherry picked from commit 9de6d20abb8fef0cd11c22676846d809ee3f9afc in dev-main) Reviewed-on: https://git-master.nvidia.com/r/2170602 GVS: Gerrit_Virtual_Submit Reviewed-by: Bibek Basu <bbasu@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
-rw-r--r--drivers/gpu/nvgpu/include/nvgpu/nvgpu_mem.h9
-rw-r--r--drivers/gpu/nvgpu/os/linux/linux-dma.c4
2 files changed, 12 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/include/nvgpu/nvgpu_mem.h b/drivers/gpu/nvgpu/include/nvgpu/nvgpu_mem.h
index e69274b5..8e62a1d6 100644
--- a/drivers/gpu/nvgpu/include/nvgpu/nvgpu_mem.h
+++ b/drivers/gpu/nvgpu/include/nvgpu/nvgpu_mem.h
@@ -174,6 +174,15 @@ struct nvgpu_mem {
174 * nvgpu_mem in a system specific way. 174 * nvgpu_mem in a system specific way.
175 */ 175 */
176#define __NVGPU_MEM_FLAG_NO_DMA (1 << 3) 176#define __NVGPU_MEM_FLAG_NO_DMA (1 << 3)
177 /*
178 * Some nvgpu_mem objects act as facades to memory buffers owned by
179 * someone else. This internal flag specifies that the sgt field is
180 * "borrowed", and it must not be freed by us.
181 *
182 * Of course the caller will have to make sure that the sgt owner
183 * outlives the nvgpu_mem.
184 */
185#define NVGPU_MEM_FLAG_FOREIGN_SGT (1 << 4)
177 unsigned long mem_flags; 186 unsigned long mem_flags;
178 187
179 /* 188 /*
diff --git a/drivers/gpu/nvgpu/os/linux/linux-dma.c b/drivers/gpu/nvgpu/os/linux/linux-dma.c
index 52987a87..d704b2a4 100644
--- a/drivers/gpu/nvgpu/os/linux/linux-dma.c
+++ b/drivers/gpu/nvgpu/os/linux/linux-dma.c
@@ -392,8 +392,10 @@ void nvgpu_dma_free_sys(struct gk20a *g, struct nvgpu_mem *mem)
392 if (mem->mem_flags & __NVGPU_MEM_FLAG_NO_DMA) 392 if (mem->mem_flags & __NVGPU_MEM_FLAG_NO_DMA)
393 nvgpu_kfree(g, mem->priv.pages); 393 nvgpu_kfree(g, mem->priv.pages);
394 394
395 if (mem->priv.sgt) 395 if ((mem->mem_flags & NVGPU_MEM_FLAG_FOREIGN_SGT) == 0 &&
396 mem->priv.sgt != NULL) {
396 nvgpu_free_sgtable(g, &mem->priv.sgt); 397 nvgpu_free_sgtable(g, &mem->priv.sgt);
398 }
397 399
398 dma_dbg_free_done(g, mem->size, "sysmem"); 400 dma_dbg_free_done(g, mem->size, "sysmem");
399 401