From 6aeb20c735a4ff49f86c8a63df700af6108cad7f Mon Sep 17 00:00:00 2001 From: Arthur Hanson Rasmusson Date: Sun, 15 Nov 2026 16:33:36 -0500 Subject: vgsp: eng64 - chain the release behind the pack carrier and name a stalled carrier's gate c779: the pack-continuation carrier completed the pack (MME-CARRY-COMPLETE gen=4 off=2799/2799) and armed the release (MME-CARRY-ARM mode=release), but its launch poll held the single forwarding slot for 2801 ms; the armed release then deferred request-inflight until the beef channel unregistered at +2.2 s, so the release ended in MME-CARRY-HOLD reason=no-channel. - svc_fwd_gr_work: after a successful synthetic pack carrier, wait out the release grace in the same slot, claim it and run the release work directly (chained MME-CARRY-FIRE mode=release ... receipt). Gate: sema_gl_mme_release_chain (default 1; release carrier still default 0). - pump pack-carry block: an armed due carrier that cannot go out now names its blocker (MME-CARRY-WAIT reason=no-channel/client-candidate/ request-inflight/fe-defer), so the c781-class silent stall is visible. - booter: gsp_phys_gr_mme_release_waiting()/chain_enabled() helpers. c783-c785 (a03a68ea build) were all shallow (author=0, no MME window). --- kernel/gsp_phys_booter.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'kernel/gsp_phys_booter.c') diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c index 4cf1c55..74b0300 100644 --- a/kernel/gsp_phys_booter.c +++ b/kernel/gsp_phys_booter.c @@ -19010,6 +19010,23 @@ module_param_named(sema_gl_mme_release_sa_arm, MODULE_PARM_DESC(sema_gl_mme_release_sa_arm, "Re-emit the START-ADDRESS RAM pairs (incl. golden slot 34 -> IR 0x265) before a saved-window release launch so CALL_MME_MACRO(34) resolves to DRAW_IAB (default 0; needs sema_gl_mme_pack_release=1)"); +/* + * Release chaining (sema_gl_mme_release_chain): the host pack-continuation + * carrier's launch poll owns the single forwarding slot for up to + * sema_mme_fast_ms (c779 elapsed 2801 ms), and the client's 3D channel can + * unregister before the next service pass fires the armed release (c779: + * release ARM at +0.1 s, beef channel unregistered ~2.2 s later -> + * MME-CARRY-HOLD reason=no-channel). With this on, a successful synthetic + * pack carrier claims the armed release after its settle grace and runs the + * release work in the same slot, while the channel is still alive. Default 1; + * the release carrier itself is default off. + */ +static bool gsp_phys_rmcall_gr_mme_release_chain = true; +module_param_named(sema_gl_mme_release_chain, + gsp_phys_rmcall_gr_mme_release_chain, bool, 0644); +MODULE_PARM_DESC(sema_gl_mme_release_chain, + "Run the armed saved-window release in the same forwarding slot right after a successful host pack-continuation carrier (default 1; needs sema_gl_mme_pack_release=1)"); + /* * DRAW_IAB preference (release carrier follow-up): the held-call window that * matters is the DRAW window, whose method stream carries the @@ -19470,6 +19487,24 @@ bool gsp_phys_gr_mme_release_take(u32 h_object, u32 *held, u32 *win) return true; } +/* An armed release is still owed (before its grace deadline too). */ +bool gsp_phys_gr_mme_release_waiting(void) +{ + struct gsp_phys_gr_mme_release_state *s = &gsp_phys_gr_mme_release; + unsigned long flags; + bool waiting; + + spin_lock_irqsave(&gsp_phys_gr_mme_release_lock, flags); + waiting = s->valid && s->armed && !s->fired && !s->consumed; + spin_unlock_irqrestore(&gsp_phys_gr_mme_release_lock, flags); + return waiting; +} + +bool gsp_phys_gr_mme_release_chain_enabled(void) +{ + return READ_ONCE(gsp_phys_rmcall_gr_mme_release_chain); +} + /* The release is still claimed and not cancelled (builder safety gate). */ static bool gsp_phys_gr_mme_release_active(void) { -- cgit v1.2.3