diff --git a/drivers/gpu/nvgpu/common/nvgpu_common.c b/drivers/gpu/nvgpu/common/nvgpu_common.c index 6b5cfa55d..521ccd9d6 100644 --- a/drivers/gpu/nvgpu/common/nvgpu_common.c +++ b/drivers/gpu/nvgpu/common/nvgpu_common.c @@ -110,6 +110,9 @@ static void nvgpu_init_mm_vars(struct gk20a *g) g->mm.bypass_smmu = platform->bypass_smmu; g->mm.disable_bigpage = platform->disable_bigpage; g->mm.vidmem_is_vidmem = platform->vidmem_is_vidmem; + + nvgpu_mutex_init(&g->mm.tlb_lock); + nvgpu_mutex_init(&g->mm.priv_lock); } int nvgpu_probe(struct gk20a *g, diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index 2539138a9..c91acbd2f 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c @@ -4811,15 +4811,15 @@ int gk20a_vm_bind_channel(struct gk20a_as_share *as_share, int gk20a_dmabuf_alloc_drvdata(struct dma_buf *dmabuf, struct device *dev) { + struct gk20a *g = gk20a_get_platform(dev)->g; struct gk20a_dmabuf_priv *priv; - static DEFINE_MUTEX(priv_lock); static u64 priv_count = 0; priv = dma_buf_get_drvdata(dmabuf, dev); if (likely(priv)) return 0; - nvgpu_mutex_acquire(&priv_lock); + nvgpu_mutex_acquire(&g->mm.priv_lock); priv = dma_buf_get_drvdata(dmabuf, dev); if (priv) goto priv_exist_or_err; @@ -4833,7 +4833,7 @@ int gk20a_dmabuf_alloc_drvdata(struct dma_buf *dmabuf, struct device *dev) priv->buffer_id = ++priv_count; dma_buf_set_drvdata(dmabuf, dev, priv, gk20a_mm_delete_priv); priv_exist_or_err: - nvgpu_mutex_release(&priv_lock); + nvgpu_mutex_release(&g->mm.priv_lock); if (IS_ERR(priv)) return -ENOMEM; @@ -5358,8 +5358,6 @@ void gk20a_mm_tlb_invalidate(struct vm_gk20a *vm) u32 addr_lo; u32 data; - static DEFINE_MUTEX(tlb_lock); - gk20a_dbg_fn(""); /* pagetables are considered sw states which are preserved after @@ -5373,7 +5371,7 @@ void gk20a_mm_tlb_invalidate(struct vm_gk20a *vm) addr_lo = u64_lo32(gk20a_mem_get_base_addr(g, &vm->pdb.mem, 0) >> 12); - nvgpu_mutex_acquire(&tlb_lock); + nvgpu_mutex_acquire(&g->mm.tlb_lock); trace_gk20a_mm_tlb_invalidate(dev_name(g->dev)); @@ -5414,7 +5412,7 @@ void gk20a_mm_tlb_invalidate(struct vm_gk20a *vm) trace_gk20a_mm_tlb_invalidate_done(dev_name(g->dev)); out: - nvgpu_mutex_release(&tlb_lock); + nvgpu_mutex_release(&g->mm.tlb_lock); } int gk20a_mm_suspend(struct gk20a *g) diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h index 5f29c9e70..d7f6cb9a4 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h @@ -361,6 +361,8 @@ struct mm_gk20a { } ce; struct nvgpu_mutex l2_op_lock; + struct nvgpu_mutex tlb_lock; + struct nvgpu_mutex priv_lock; #ifdef CONFIG_ARCH_TEGRA_18x_SOC struct mem_desc bar2_desc; #endif diff --git a/drivers/gpu/nvgpu/vgpu/mm_vgpu.c b/drivers/gpu/nvgpu/vgpu/mm_vgpu.c index 70b50e7ea..10bbbccbc 100644 --- a/drivers/gpu/nvgpu/vgpu/mm_vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/mm_vgpu.c @@ -30,6 +30,9 @@ static int vgpu_init_mm_setup_sw(struct gk20a *g) return 0; } + nvgpu_mutex_init(&mm->tlb_lock); + nvgpu_mutex_init(&mm->priv_lock); + mm->g = g; /*TBD: make channel vm size configurable */