diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/channel_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index 78953558..65b17304 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |||
@@ -196,6 +196,8 @@ void gk20a_channel_abort_clean_up(struct channel_gk20a *ch) | |||
196 | nvgpu_mutex_acquire(&ch->sync_lock); | 196 | nvgpu_mutex_acquire(&ch->sync_lock); |
197 | if (ch->sync) | 197 | if (ch->sync) |
198 | ch->sync->set_min_eq_max(ch->sync); | 198 | ch->sync->set_min_eq_max(ch->sync); |
199 | if (ch->user_sync) | ||
200 | ch->user_sync->set_safe_state(ch->user_sync); | ||
199 | nvgpu_mutex_release(&ch->sync_lock); | 201 | nvgpu_mutex_release(&ch->sync_lock); |
200 | 202 | ||
201 | /* release all job semaphores (applies only to jobs that use | 203 | /* release all job semaphores (applies only to jobs that use |
@@ -435,11 +437,18 @@ static void gk20a_free_channel(struct channel_gk20a *ch, bool force) | |||
435 | /* sync must be destroyed before releasing channel vm */ | 437 | /* sync must be destroyed before releasing channel vm */ |
436 | nvgpu_mutex_acquire(&ch->sync_lock); | 438 | nvgpu_mutex_acquire(&ch->sync_lock); |
437 | if (ch->sync) { | 439 | if (ch->sync) { |
438 | gk20a_channel_sync_destroy(ch->sync); | 440 | gk20a_channel_sync_destroy(ch->sync, false); |
439 | ch->sync = NULL; | 441 | ch->sync = NULL; |
440 | } | 442 | } |
441 | if (ch->user_sync) { | 443 | if (ch->user_sync) { |
442 | gk20a_channel_sync_destroy(ch->user_sync); | 444 | /* |
445 | * Set user managed syncpoint to safe state | ||
446 | * But it's already done if channel has timedout | ||
447 | */ | ||
448 | if (ch->has_timedout) | ||
449 | gk20a_channel_sync_destroy(ch->user_sync, false); | ||
450 | else | ||
451 | gk20a_channel_sync_destroy(ch->user_sync, true); | ||
443 | ch->user_sync = NULL; | 452 | ch->user_sync = NULL; |
444 | } | 453 | } |
445 | nvgpu_mutex_release(&ch->sync_lock); | 454 | nvgpu_mutex_release(&ch->sync_lock); |
@@ -1211,7 +1220,7 @@ clean_up_prealloc: | |||
1211 | channel_gk20a_free_prealloc_resources(c); | 1220 | channel_gk20a_free_prealloc_resources(c); |
1212 | clean_up_sync: | 1221 | clean_up_sync: |
1213 | if (c->sync) { | 1222 | if (c->sync) { |
1214 | gk20a_channel_sync_destroy(c->sync); | 1223 | gk20a_channel_sync_destroy(c->sync, false); |
1215 | c->sync = NULL; | 1224 | c->sync = NULL; |
1216 | } | 1225 | } |
1217 | clean_up_unmap: | 1226 | clean_up_unmap: |
@@ -1905,7 +1914,8 @@ void gk20a_channel_clean_up_jobs(struct channel_gk20a *c, | |||
1905 | if (nvgpu_atomic_dec_and_test( | 1914 | if (nvgpu_atomic_dec_and_test( |
1906 | &c->sync->refcount) && | 1915 | &c->sync->refcount) && |
1907 | g->aggressive_sync_destroy) { | 1916 | g->aggressive_sync_destroy) { |
1908 | gk20a_channel_sync_destroy(c->sync); | 1917 | gk20a_channel_sync_destroy(c->sync, |
1918 | false); | ||
1909 | c->sync = NULL; | 1919 | c->sync = NULL; |
1910 | } | 1920 | } |
1911 | nvgpu_mutex_release(&c->sync_lock); | 1921 | nvgpu_mutex_release(&c->sync_lock); |