summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-23 15:03:33 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-23 15:03:33 -0400
commitaa008361479882935798c78ea8ebd791533cca63 (patch)
tree7ede5abba2cc0ff18889b27c119188c966de9ed4
parent8de9f0e24d9511db9edab879fac1f8f07a3e9fbc (diff)
downloadopen-iov-aa008361479882935798c78ea8ebd791533cca63.tar.gz
open-iov-aa008361479882935798c78ea8ebd791533cca63.zip
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).
-rw-r--r--kernel/gsp_sema_service.c12
1 files changed, 11 insertions, 1 deletions
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;