summaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/gsp_sema_service.c12
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;