diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index a52438344..02ec5835b 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c @@ -2519,18 +2519,25 @@ static unsigned int gk20a_event_id_poll(struct file *filep, poll_table *wait) if (event_id_data->is_tsg) { struct tsg_gk20a *tsg = g->fifo.tsg + event_id_data->id; - gk20a_dbg_info( - "found pending event_id=%d on TSG=%d\n", - event_id, tsg->tsgid); + if (event_id_data->event_posted) { + gk20a_dbg_info( + "found pending event_id=%d on TSG=%d\n", + event_id, tsg->tsgid); + mask = (POLLPRI | POLLIN); + event_id_data->event_posted = false; + } } else { struct channel_gk20a *ch = g->fifo.channel + event_id_data->id; - gk20a_dbg_info( - "found pending event_id=%d on chid=%d\n", - event_id, ch->hw_chid); + if (event_id_data->event_posted) { + gk20a_dbg_info( + "found pending event_id=%d on chid=%d\n", + event_id, ch->hw_chid); + mask = (POLLPRI | POLLIN); + event_id_data->event_posted = false; + } } - mask = (POLLPRI | POLLIN); mutex_unlock(&event_id_data->lock); @@ -2609,6 +2616,7 @@ void gk20a_channel_event_id_post_event(struct channel_gk20a *ch, gk20a_dbg_info( "posting event for event_id=%d on ch=%d\n", event_id, ch->hw_chid); + event_id_data->event_posted = true; wake_up_interruptible_all(&event_id_data->event_id_wq); diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.h b/drivers/gpu/nvgpu/gk20a/channel_gk20a.h index 29a13d24b..4e0db3cfb 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.h @@ -84,6 +84,8 @@ struct gk20a_event_id_data { bool is_tsg; u32 event_id; + bool event_posted; + wait_queue_head_t event_id_wq; struct mutex lock; struct list_head event_id_node; diff --git a/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c b/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c index 5298d3809..f7d5535d1 100644 --- a/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c @@ -231,6 +231,7 @@ void gk20a_tsg_event_id_post_event(struct tsg_gk20a *tsg, gk20a_dbg_info( "posting event for event_id=%d on tsg=%d\n", event_id, tsg->tsgid); + event_id_data->event_posted = true; wake_up_interruptible_all(&event_id_data->event_id_wq);