From c9661edb46f087c67ffd9dca7ac30b291503ecd3 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Rasmusson Date: Sun, 15 Nov 2026 15:15:14 -0500 Subject: vgsp: eng59b - do not let the arming launch consume the release carrier; re-arm in the pump The saved-window release carrier was armed inside the pack-completing launch's own build, and the client-first cancel treated that same launch (and its retries) as the next client launch, silently dropping the claim. c762: MME-CARRY-SAVE (win=240 held=68) -> MME-CARRY-ARM mode=release -> the arming launch ran mac=0 (LOAD-ONLY, window dropped, held CALLs still owed) -> no FIRE, no synthetic push, no mac=0x22. Track the arming launch identity (h + push) and keep the claim armed across it; only the MME-PACK-REARM edge (calls actually released), a real consumer, context/handle changes, or a launch error cancels/consumes. Add a pump-side re-arm once pack_done_gen is set, and bounded MME-CARRY-HOLD receipts for every skip. One fire per pack completion, no retries. Build rc 0; validation pending (c762-class boot with sema_gl_mme_pack_release=1). --- kernel/gsp_sema_service.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) (limited to 'kernel/gsp_sema_service.c') diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c index 6d72a62..26d3b1a 100644 --- a/kernel/gsp_sema_service.c +++ b/kernel/gsp_sema_service.c @@ -50031,15 +50031,19 @@ static void svc_pump_channels(struct nv_vgpu_device *vgpu) /* * Saved-window release carrier (sema_gl_mme_pack_release). After the - * channel loop (a client window decoded in this pass wins and cancels - * the pending release), fire the saved held-call window once the pack - * completed and the settle grace expired. Same gates as the - * continuation carrier, except the FE-busy defer (this launch carries - * a real window, not a LOAD-ONLY carrier). + * channel loop (so a client window decoded in this pass is offered + * first), re-arm the saved held-call window if a race left the record + * valid but disarmed, then fire it once the pack completed and the + * settle grace expired. Same gates as the continuation carrier, except + * the FE-busy defer (this launch carries a real window, not a + * LOAD-ONLY carrier). A real client window never cancels the release: + * only the MME-PACK-REARM edge (calls actually released) does. */ { u32 rel_h = 0; + bool found = false; + gsp_phys_gr_mme_release_rearm(); if (gsp_phys_gr_mme_release_peek(&rel_h)) { int ci; @@ -50048,14 +50052,25 @@ static void svc_pump_channels(struct nv_vgpu_device *vgpu) if (c->h_object != rel_h || c->engine_type) continue; - if (svc_gr_cand_unoffered_for(rel_h)) + found = true; + if (svc_gr_cand_unoffered_for(rel_h)) { + pr_info_ratelimited("vgsp-gr: MME-CARRY-HOLD reason=client-candidate h=0x%x\n", + rel_h); break; + } if (svc_fwd_hold.active || - test_bit(SVC_FWD_INFLIGHT, &svc_fwd_state)) + test_bit(SVC_FWD_INFLIGHT, + &svc_fwd_state)) { + pr_info_ratelimited("vgsp-gr: MME-CARRY-HOLD reason=request-inflight h=0x%x\n", + rel_h); break; + } (void)svc_gr_carrier_request(vgpu, c, true); break; } + if (!found) + pr_info_ratelimited("vgsp-gr: MME-CARRY-HOLD reason=no-channel h=0x%x\n", + rel_h); } } -- cgit v1.2.3