summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_rm_emulation.c
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-11-12 23:25:00 -0500
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-11-12 23:25:00 -0500
commit770d6b4af7f44acc104c6149b9c473de1db607e7 (patch)
tree5422c6b1eb8547664c95b131edaccef446743e23 /kernel/gsp_rm_emulation.c
parent6ebc7cd40b09b6c922e8b87209a74da60f347739 (diff)
downloadopen-iov-770d6b4af7f44acc104c6149b9c473de1db607e7.tar.gz
open-iov-770d6b4af7f44acc104c6149b9c473de1db607e7.zip
vgsp: flip-event delivery defaults to assoc+strict (clears Flip event timeout); DDX latch reset clauses
Wall (b) 'Flip event timeout on head 0' fix (validated c171): NVKMS/kernel- callback events register hSrcResource=0, so every display UPDATE completion rode the all-events shotgun (6-7 POST_EVENT records each), the guest's status-queue read cursor fell 20-44 slots behind (rc=-11 ring-full bursts) and flip records arrived past the 3 s NvDrm window. Default the r1765 pair ON - gsp_rm_ev_assoc (hSrc==0 -> alloc-parent channel) and gsp_disp_events_strict (armed UPDATE posts only to that channel's events, no fallback) - the exact combination r1771 measured as '0 flip WARNs'. Validating cycle c171: registrations carry real sources (hEvent=0x1007a hSrc=0x1001b etc.), UPDATE posts are exact 1:1 (posts=27), WARN count 1 for the boot, serial timeouts=0 (c160 pre-fix: 34). Both stay runtime-writable. Also stage the gsp_sema_service.c candidates for wall (a) (the later-DMA 0x51 is a consequence of 'Failed to idle DMA' on a recycled channel): the served-refusal in svc_userd_ddx_reprobe now exempts a latch reset to put==0, and the put-reset latch keep extends to the DDX family (was kick-only). These clauses target c171's observed reset/junk-adopt sequence; validation pending on a roll where wall (a) is otherwise survivable.
Diffstat (limited to 'kernel/gsp_rm_emulation.c')
-rw-r--r--kernel/gsp_rm_emulation.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/kernel/gsp_rm_emulation.c b/kernel/gsp_rm_emulation.c
index 0cef9e7..957729b 100644
--- a/kernel/gsp_rm_emulation.c
+++ b/kernel/gsp_rm_emulation.c
@@ -818,16 +818,26 @@ unsigned gsp_rm_ev_cl;
*/
unsigned gsp_rm_ev_func;
/*
- * r1767: gate the r1765 flip-event association (hSrcResource == 0 ->
- * alloc-header hParent). Default 0 keeps the pre-r1766 event semantics;
- * the RCA exonerated the association from the r1766 soft-locks but not
- * from the r1766 ISR crash class, so it stays off until validated
- * end-to-end.
+ * r1765 flip-event association (hSrcResource == 0 -> alloc-header hParent).
+ * Default was 0 (pre-r1766 semantics) pending through r1771 A/B validation;
+ * r1771 measured on the live stack: assoc=1 alone -> flip WARNs + burst
+ * storms, assoc=1 + disp_events_strict=1 -> 0 flip WARNs (the r1771 X death
+ * was the separate DDX channel-idle wall, since fixed by 13a0c5d6/acb51d53).
+ * r1780 rationale (c160 receipts, eng5 session): NVKMS/kernel-callback
+ * events register hSrc=0, so every completion rode the all-events shotgun
+ * (6-7 POST_EVENT records per completion). The guest stat-queue read
+ * cursor sat 20-44 slots behind our write pointer, rc=-11 (ring full)
+ * refusals burst during X starts, and flip-event records reached the guest
+ * long after the 3 s NvDrm flip window -> "Flip event timeout on head 0"
+ * x7 per X start with zero nvidia-modeset kthread delivery. With the
+ * association the display UPDATE post (h_object=0x1001b) exact-matches only
+ * the NVKMS flip events registered on that channel: 1:1 delivery, no flood.
+ * Still runtime-writable for A/B.
*/
-static bool gsp_rm_ev_assoc; /* default 0: pre-r1766 event semantics */
+static bool gsp_rm_ev_assoc = true; /* r1780: default 1 (validated r1771+r1780) */
module_param_named(ev_assoc, gsp_rm_ev_assoc, bool, 0644);
MODULE_PARM_DESC(ev_assoc,
- "associate hSrcResource==0 events with their alloc parent (r1765 flip-event fix; default 0)");
+ "associate hSrcResource==0 events with their alloc parent (r1765 flip-event fix; default 1)");
static void gsp_rm_fill_ev_payload(const struct gsp_rm_emu *rm, u32 i,
u8 *payload)