From aa008361479882935798c78ea8ebd791533cca63 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Rasmusson Date: Fri, 23 Oct 2026 15:03:33 -0400 Subject: vgsp-gr r554: the per-VA launch-defer latch needs 64 slots, not 8 r553 soak evidence (victory_reduce, 430 s stall, 0 hangs): the same launch push VA (0x20043be64) was deferred on every pass for 7+ minutes ("partial argument set: 7-8 pages unresolved"). A client's UVM pool allocates ~8-10 channels and each command buffer reuses two launch push slots, so more than 8 distinct push VAs rotate through the guard; with 8 latch slots each new VA evicted another and the one-deferral-per-VA guarantee thrashed - the second sighting of any VA found its record gone and deferred again, so a partial argument set that never resolves held the launch forever. 64 slots cover a full client with margin (1 KB of static state). --- kernel/gsp_sema_service.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'kernel/gsp_sema_service.c') diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c index 91f1df9..b2cf8a5 100644 --- a/kernel/gsp_sema_service.c +++ b/kernel/gsp_sema_service.c @@ -20673,7 +20673,17 @@ static void svc_handle_map_add(void); * any VA proceeds (bounded, cannot hang), interleaved launches included. */ #define SVC_GR_ARG_DEFER_MS 30000u -#define SVC_GR_ARG_DEFER_SLOTS 8 +/* + * r554: 64, not 8. The latch must remember every launch push VA of the + * current client (the UVM pool allocates ~8-10 channels and each command + * buffer reuses two launch push slots, so >8 distinct VAs are in rotation); + * with 8 slots each new VA evicted another and the "one deferral per VA" + * guarantee thrashed - r553 soak: victory_reduce re-deferred the same push + * VA (0x20043be64) every pass for 430 s ("partial argument set: 7-8 pages + * unresolved") and never forwarded. 64 covers a full client with margin; + * the table is per-boot tiny (64 * 16 B). + */ +#define SVC_GR_ARG_DEFER_SLOTS 64 static u64 svc_gr_arg_defer_va[SVC_GR_ARG_DEFER_SLOTS]; static unsigned long svc_gr_arg_defer_j[SVC_GR_ARG_DEFER_SLOTS]; static u32 svc_gr_arg_defer_pos; -- cgit v1.2.3