diff options
| -rw-r--r-- | kernel/gsp_sema_service.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c index 30c5561..e97c2ff 100644 --- a/kernel/gsp_sema_service.c +++ b/kernel/gsp_sema_service.c @@ -4995,6 +4995,7 @@ static bool svc_fake_release(struct nv_vgpu_device *vgpu, struct svc_channel *ch svc.releases_applied++; } svc.releases_faked++; + svc_rel_count++; ch->expected_sem_payload++; return true; } @@ -5149,6 +5150,9 @@ static void svc_pump_channels(struct nv_vgpu_device *vgpu) } } + u32 rel_n_iter = svc_rel_count; + + (void)rel_n_iter; if (rrc) { stalled = true; /* ring unreadable: sweep RAM */ break; @@ -5614,7 +5618,10 @@ if (gsp_sema_fake_rel && } ch->rescue_fail = 0; ch->defer_since = 0; - svc_replay_note(ch, idx, put); + if (gsp_sema_fake_rel || + gsp_sema_rel_recover) + svc_replay_note(ch, idx, + put); ch->last_get = (idx + 1) % ch->gpfifo_entries; svc.gpfifo_skipped++; @@ -5650,7 +5657,8 @@ if (gsp_sema_fake_rel && } } - svc_replay_note(ch, idx, put); + if (ch->engine_type && svc_rel_count != rel_n_iter) + svc_replay_note(ch, idx, put); ch->last_get = (idx + 1) % ch->gpfifo_entries; ch->rescue_fail = 0; ch->defer_since = 0; |
