summaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-23 21:06:53 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-23 21:06:53 -0400
commit4f648aba4706af53e746e093ed8137771d947fe1 (patch)
treec93aa92c1514cb2a939eb3a32789998f1570e7a8 /kernel
parente25b9b9e37bb0612bc17d2e8c1710e1c4950cd80 (diff)
downloadopen-iov-4f648aba4706af53e746e093ed8137771d947fe1.tar.gz
open-iov-4f648aba4706af53e746e093ed8137771d947fe1.zip
vgsp-sema r581: do not pay the translation grace for provably-foreign rescued content
r577's foreign-release gate made unreadable entries take the !rel_seen path, where each entry pays the full ce_grace_ms hold before the exact-slot fallback delivers its pool step ('skipping stale entry ... after 8000 ms grace' every ~8 s on the r577/r580 boots; a client's init crawls for minutes). When the rescue decoded a release but the gate refused it as a tracking slot, the content is provably stale/foreign: no work may run from it (rescued work is never executed anyway) and the 8 s wait buys only the small chance that the real page lands inside the window. Backdate defer_since so the consume path delivers the pool step immediately; the translation grace still applies to entries whose rescue decoded nothing (their content may still be the real push).
Diffstat (limited to 'kernel')
-rw-r--r--kernel/gsp_sema_service.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c
index 4fd160e..741fdc2 100644
--- a/kernel/gsp_sema_service.c
+++ b/kernel/gsp_sema_service.c
@@ -23706,6 +23706,31 @@ static void svc_pump_channels(struct nv_vgpu_device *vgpu)
(!ch->engine_type ||
svc_pool_sem_va(svc_rel_va_seen));
}
+ /*
+ * r581: the rescue decoded a
+ * release but the r577 gate
+ * refused it as a tracking slot
+ * (rel_seen false while the
+ * counter moved) - the content
+ * is provably stale/foreign, no
+ * work may run from it, and
+ * waiting the 8 s translation
+ * grace per entry crawls the
+ * client's init for minutes
+ * (r577/r580 boots: 'skipping
+ * stale entry ... after 8000 ms
+ * grace' every ~8 s). Backdate
+ * the deferral so the consume
+ * path delivers the pool step
+ * through the exact-slot
+ * fallback immediately.
+ */
+ if (!rel_seen &&
+ svc_rel_count != rel_n2 &&
+ ch->engine_type &&
+ ch->expected_sem_payload)
+ ch->defer_since = jiffies -
+ msecs_to_jiffies(gsp_sema_ce_grace_ms + 100);
}
}
if (rel_seen) {
@@ -23736,6 +23761,7 @@ static void svc_pump_channels(struct nv_vgpu_device *vgpu)
ch->unread_va = 0;
ch->unread_until = 0;
}
+
ch->submissions++;
svc.gpfifo_entries_done++;
if (ch->engine_type && ch->expected_sem_payload) {