diff --git a/drivers/gpu/nvgpu/common/cic/mon/mon_intr.c b/drivers/gpu/nvgpu/common/cic/mon/mon_intr.c index d920b2539..79f24381c 100644 --- a/drivers/gpu/nvgpu/common/cic/mon/mon_intr.c +++ b/drivers/gpu/nvgpu/common/cic/mon/mon_intr.c @@ -185,12 +185,14 @@ u32 nvgpu_cic_mon_intr_stall_isr(struct gk20a *g) void nvgpu_cic_mon_intr_stall_handle(struct gk20a *g) { + nvgpu_mutex_acquire(&g->mc.intr_thread_mutex); g->ops.mc.isr_stall(g); /* sync handled irq counter before re-enabling interrupts */ nvgpu_cic_rm_set_irq_stall(g, 0); nvgpu_cic_mon_intr_stall_resume(g); + nvgpu_mutex_release(&g->mc.intr_thread_mutex); (void)nvgpu_cic_rm_broadcast_last_irq_stall(g); } diff --git a/drivers/gpu/nvgpu/include/nvgpu/mc.h b/drivers/gpu/nvgpu/include/nvgpu/mc.h index e7a723555..cfa54975d 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/mc.h +++ b/drivers/gpu/nvgpu/include/nvgpu/mc.h @@ -188,6 +188,8 @@ struct nvgpu_intr_unit_info { struct nvgpu_mc { /** Lock to access the MC interrupt registers. */ struct nvgpu_spinlock intr_lock; + /** Lock to synchronise between stall interrupt threads. */ + struct nvgpu_mutex intr_thread_mutex; /** Lock to access the MC unit registers. */ struct nvgpu_spinlock enable_lock; diff --git a/drivers/gpu/nvgpu/os/linux/driver_common.c b/drivers/gpu/nvgpu/os/linux/driver_common.c index bb862c0a2..c6de85e45 100644 --- a/drivers/gpu/nvgpu/os/linux/driver_common.c +++ b/drivers/gpu/nvgpu/os/linux/driver_common.c @@ -86,7 +86,7 @@ static void nvgpu_init_vars(struct gk20a *g) nvgpu_spinlock_init(&g->power_spinlock); nvgpu_spinlock_init(&g->mc.intr_lock); - + nvgpu_mutex_init(&g->mc.intr_thread_mutex); nvgpu_mutex_init(&platform->railgate_lock); nvgpu_mutex_init(&g->dbg_sessions_lock); nvgpu_mutex_init(&g->power_lock);