diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-25 18:24:55 -0400 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-25 18:24:55 -0400 |
| commit | ef4cd462dc04e20c596a917cd210b4f5016d0657 (patch) | |
| tree | dbaa779f8ad414d82ed4799a70a0717ae760013a /kernel | |
| parent | 4bd21c44bc2430b87a1aa73d46695f07eb1bd5ec (diff) | |
| download | open-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')
| -rw-r--r-- | kernel/gsp_sema_service.c | 25 |
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 |
