diff --git a/drivers/gpu/nvgpu/include/nvgpu/nvgpu_mem.h b/drivers/gpu/nvgpu/include/nvgpu/nvgpu_mem.h index 76c225eb4..0ad8dbb6d 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/nvgpu_mem.h +++ b/drivers/gpu/nvgpu/include/nvgpu/nvgpu_mem.h @@ -177,6 +177,15 @@ struct nvgpu_mem { * nvgpu_mem in a system specific way. */ #define __NVGPU_MEM_FLAG_NO_DMA (1 << 3) + /* + * Some nvgpu_mem objects act as facades to memory buffers owned by + * someone else. This internal flag specifies that the sgt field is + * "borrowed", and it must not be freed by us. + * + * Of course the caller will have to make sure that the sgt owner + * outlives the nvgpu_mem. + */ +#define NVGPU_MEM_FLAG_FOREIGN_SGT (1 << 4) unsigned long mem_flags; /* diff --git a/drivers/gpu/nvgpu/os/linux/linux-dma.c b/drivers/gpu/nvgpu/os/linux/linux-dma.c index 52987a874..d704b2a4f 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) if (mem->mem_flags & __NVGPU_MEM_FLAG_NO_DMA) nvgpu_kfree(g, mem->priv.pages); - if (mem->priv.sgt) + if ((mem->mem_flags & NVGPU_MEM_FLAG_FOREIGN_SGT) == 0 && + mem->priv.sgt != NULL) { nvgpu_free_sgtable(g, &mem->priv.sgt); + } dma_dbg_free_done(g, mem->size, "sysmem");