diff options
Diffstat (limited to 'kernel/gsp_sema_service.c')
| -rw-r--r-- | kernel/gsp_sema_service.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c index 3c732e8..2874cc1 100644 --- a/kernel/gsp_sema_service.c +++ b/kernel/gsp_sema_service.c @@ -3961,7 +3961,7 @@ static void svc_init_expected_payload(struct nv_vgpu_device *vgpu, &cur, sizeof(cur))) return; - if (cur > 0 && cur < 0x100000) { + if (cur < 0x100000) { ch->expected_sem_payload = cur + 1; if (ch->logged_expected != cur) { ch->logged_expected = cur; @@ -4235,6 +4235,7 @@ static void svc_pump_channels(struct nv_vgpu_device *vgpu) */ { u64 rel_before = svc_rel_va_seen; + bool rel_seen; svc_decode_stream(vgpu, pb, len, 0, @@ -4243,15 +4244,19 @@ static void svc_pump_channels(struct nv_vgpu_device *vgpu) ch->engine_type, va, injected); - if (svc_rel_va_seen != rel_before) + rel_seen = (svc_rel_va_seen != rel_before); + if (rel_seen) ch->last_rel_va = svc_rel_va_seen; + ch->submissions++; + svc.gpfifo_entries_done++; + if (ch->engine_type && ch->expected_sem_payload) { + if (!rel_seen && gsp_sema_fake_rel) + svc_fake_release(vgpu, ch); + else + ch->expected_sem_payload++; + } } - ch->submissions++; - svc.gpfifo_entries_done++; - /* Advance expected payload for this channel's tracking semaphore. */ - if (ch->engine_type && ch->expected_sem_payload) - ch->expected_sem_payload++; } else { /* * Content rescue: the push-buffer VA is not |
