summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_sema_service.c
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-25 18:24:55 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-25 18:24:55 -0400
commitef4cd462dc04e20c596a917cd210b4f5016d0657 (patch)
treedbaa779f8ad414d82ed4799a70a0717ae760013a /kernel/gsp_sema_service.c
parent4bd21c44bc2430b87a1aa73d46695f07eb1bd5ec (diff)
downloadopen-iov-ef4cd462dc04e20c596a917cd210b4f5016d0657.tar.gz
open-iov-ef4cd462dc04e20c596a917cd210b4f5016d0657.zip
vgsp-sema: every-pass VAS candidate verify with the last-good ring pair (r707e) - the r710 boot shows the host content-located trigger registers the user VAS and the walk resolves (walk_probe va=0x4ca0000: vas[3] h=0xfade0002 pdb=0x101d63000 -> rc=0 pa=0x11fa20000), while the pump's own svc_lookup pair only registered the three internal VASes (all rc=-2); the working order is: content-located trigger FIRST (registers the user VAS), then sema_chan_rewind so the replay re-reads the entries with the working VAS
Diffstat (limited to 'kernel/gsp_sema_service.c')
-rw-r--r--kernel/gsp_sema_service.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c
index 25fd408..21a39a2 100644
--- a/kernel/gsp_sema_service.c
+++ b/kernel/gsp_sema_service.c
@@ -13922,6 +13922,18 @@ static u32 svc_pushpg_split_log;
*/
/* r707d: bounded push-read failure witness (see below). */
static u32 svc_pushfail_log;
+/*
+ * r707e: last content-backed ring pair resolved by any channel. The VAS
+ * candidate verify is retried with it on EVERY pump pass: the parked
+ * COPY_SERVER_PDES candidate for the client's user VAS parks at
+ * device-create and must register before the submit's first push read
+ * (a failed GR entry read is never retried with a fresh VAS), but the ring
+ * resolution and the park race within one pass - the every-pass retry
+ * closes that race in a single boot.
+ */
+static u64 svc_lastgood_ring_va;
+static u64 svc_lastgood_ring_pa;
+
static int svc_read_va_push_ex(struct nv_vgpu_device *vgpu,
struct svc_channel *ch, u64 va, void *buf,
@@ -23669,6 +23681,15 @@ static void svc_pump_channels(struct nv_vgpu_device *vgpu)
}
}
/*
+ * r707e: every-pass candidate verify with the last-good ring pair.
+ * Cheap (<=16 parked candidates, one walk each) and idempotent; the
+ * first pass after the user-VAS candidate parks registers it, so the
+ * client's very first push reads resolve.
+ */
+ if (svc_lastgood_ring_pa)
+ svc_vas_candidates_verify(vgpu, svc_lastgood_ring_va,
+ svc_lastgood_ring_pa);
+ /*
* r507o stream-order: walk the CE channels BEFORE the GR channels.
* The client's stream order places its H2D copies before the kernel
* that consumes them, but the channels register in handle order (the
@@ -23885,6 +23906,10 @@ static void svc_pump_channels(struct nv_vgpu_device *vgpu)
if (!rrc)
svc_pb_pair(vgpu, ch);
+ if (!rrc && ring_pa) {
+ svc_lastgood_ring_va = ch->gpfifo_va;
+ svc_lastgood_ring_pa = ring_pa;
+ }
/*
* r707f (FOLD): the moment ANY channel's ring resolves through
* the channel object, verify the parked COPY_SERVER_PDES VAS