summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-12 13:25:31 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-12 13:25:31 -0400
commitb1075d754f6547b57fc4bdc3e1fc542001cbb981 (patch)
tree1b059a39488c9fb8a830ab41c9262567a143b1d8
parentde595dc64d8e3a01a95282bacc5bc987510d7c5e (diff)
downloadopen-iov-b1075d754f6547b57fc4bdc3e1fc542001cbb981.tar.gz
open-iov-b1075d754f6547b57fc4bdc3e1fc542001cbb981.zip
vgsp-sema: persist the GR data-arg hold window across pump passes
The pump works on a snapshot copy of the channel table; without the end-of-pass write-back the hold window was re-armed every pass and a launch whose argument pointers never translate was never consumed (r122: smiley's launch held forever). Persist gr_hold_until/gr_hold_idx so the hold is exactly one bounded window per entry, then the entry is consumed as before.
-rw-r--r--kernel/gsp_sema_service.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c
index 4bed8ab..9ab609a 100644
--- a/kernel/gsp_sema_service.c
+++ b/kernel/gsp_sema_service.c
@@ -14869,6 +14869,14 @@ static void svc_pump_channels(struct nv_vgpu_device *vgpu)
svc.chan[k].unread_idx = ch->unread_idx;
svc.chan[k].unread_until = ch->unread_until;
svc.chan[k].unread_ipin_pa = ch->unread_ipin_pa;
+ /*
+ * m150: the GR data-arg hold window is snapshot
+ * state too; without the write-back every pass
+ * would re-arm it and a permanently unresolved
+ * launch would never be consumed.
+ */
+ svc.chan[k].gr_hold_until = ch->gr_hold_until;
+ svc.chan[k].gr_hold_idx = ch->gr_hold_idx;
svc.chan[k].pushpg_va = ch->pushpg_va;
svc.chan[k].pushpg_n = ch->pushpg_n;
svc.chan[k].content_max = ch->content_max;