diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/tsg_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/tsg_gk20a.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c b/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c index 3e83cd06..716388ec 100644 --- a/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c | |||
@@ -451,6 +451,7 @@ void gk20a_tsg_release(struct kref *ref) | |||
451 | { | 451 | { |
452 | struct tsg_gk20a *tsg = container_of(ref, struct tsg_gk20a, refcount); | 452 | struct tsg_gk20a *tsg = container_of(ref, struct tsg_gk20a, refcount); |
453 | struct gk20a *g = tsg->g; | 453 | struct gk20a *g = tsg->g; |
454 | struct gk20a_event_id_data *event_id_data, *event_id_data_temp; | ||
454 | 455 | ||
455 | if (tsg->tsg_gr_ctx) { | 456 | if (tsg->tsg_gr_ctx) { |
456 | gr_gk20a_free_tsg_gr_ctx(tsg); | 457 | gr_gk20a_free_tsg_gr_ctx(tsg); |
@@ -462,6 +463,16 @@ void gk20a_tsg_release(struct kref *ref) | |||
462 | } | 463 | } |
463 | 464 | ||
464 | gk20a_sched_ctrl_tsg_removed(g, tsg); | 465 | gk20a_sched_ctrl_tsg_removed(g, tsg); |
466 | |||
467 | /* unhook all events created on this TSG */ | ||
468 | mutex_lock(&tsg->event_id_list_lock); | ||
469 | list_for_each_entry_safe(event_id_data, event_id_data_temp, | ||
470 | &tsg->event_id_list, | ||
471 | event_id_node) { | ||
472 | list_del_init(&event_id_data->event_id_node); | ||
473 | } | ||
474 | mutex_unlock(&tsg->event_id_list_lock); | ||
475 | |||
465 | release_used_tsg(&g->fifo, tsg); | 476 | release_used_tsg(&g->fifo, tsg); |
466 | 477 | ||
467 | tsg->runlist_id = ~0; | 478 | tsg->runlist_id = ~0; |