diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-11-12 21:39:29 -0500 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-11-12 21:39:29 -0500 |
| commit | 9b91798df5a59d628d627c8596a2295be0a47eaa (patch) | |
| tree | 00b48b49118ebbfc7d65df9a6d75d2de78d18ece /kernel/gsp_sema_service.c | |
| parent | 9f32d544a59eea41d4770b0867be6b8684468406 (diff) | |
| download | open-iov-9b91798df5a59d628d627c8596a2295be0a47eaa.tar.gz open-iov-9b91798df5a59d628d627c8596a2295be0a47eaa.zip | |
vgsp: X-DMA wall witness for 0x1000013; add params-r1624.txt (rich bring-up set)
One rate-limited (0.5 s) sema-xchan line per pass for the X DDX channel:
rrc/uok/upa/uas/put/get/last/ring_pa/entry0 - names the decode-gate state
independently of the shared userdp budget. Diagnostic only, no behaviour
change. params-r1624.txt is the rich r1624 insmod set as a durable
tools/guest-diag file (INSMOD_PARAMS=tools/guest-diag/params-r1624.txt).
Context (c130/c131 with the rich set): the DDX DMA test now PASSES on most
attempts (tracker release decoded + delivered); the remaining gap is the
USERD speculative-latch lifetime (a latch that delivered the test kick is
REJECTED 15 s later with no PUT advance; the next generation then adopts a
stale VRAM block, put=2 get=0, and the retry window closes) plus a later
'Push buffer object allocation failed: 0x51 NV_ERR_NO_MEMORY' (emulated heap
accounting; 1872 MiB free).
Diffstat (limited to 'kernel/gsp_sema_service.c')
| -rw-r--r-- | kernel/gsp_sema_service.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c index 948285b..82dceaf 100644 --- a/kernel/gsp_sema_service.c +++ b/kernel/gsp_sema_service.c @@ -44449,6 +44449,40 @@ static void svc_pump_channels(struct nv_vgpu_device *vgpu) ch->h_object >= 0xbfef0000u && ch->h_object <= 0xbfef00ffu) svc_pub_advance(ch); + /* + * X-DMA wall witness (2026-11-12): the X DDX channel + * (0x1000013) either stalls before its entries are decoded + * (USERD unresolved) or advances a put the pump never sees. + * One rate-limited line per half second names the state the + * pass decides on, independent of the shared userdp budget. + */ + if (gsp_sema_dbg && ch->h_object == 0x1000013u) { + static unsigned long xchan_at; + + if (time_after(jiffies, xchan_at)) { + u32 xe0 = 0, xe1 = 0; + u64 xeva = 0, xelen = 0; + u8 xre[8]; + + xchan_at = jiffies + HZ / 2; + if (ring_pa && !rrc && + !svc_read_ap(vgpu, ring_pa, ring_ap, + xre, sizeof(xre))) { + memcpy(&xe0, xre, 4); + memcpy(&xe1, xre + 4, 4); + xeva = ((u64)(xe1 & 0xff) << 32) | + (u64)(xe0 & 0xfffffffc); + xelen = ((u64)((xe1 >> 10) & + 0x1fffffu)) << 2; + } + pr_info("sema-xchan: h=0x%x rrc=%d uok=%u upa=0x%llx uas=%d put=%u get=%u last=%u ring_pa=0x%llx rap=%d e0va=0x%llx elen=%llu\n", + ch->h_object, rrc, + ch->userd_ok ? 1u : 0u, + ch->userd_pa, ch->userd_as, put, get, + (u32)ch->last_get, ring_pa, ring_ap, + xeva, xelen); + } + } if (!ch->userd_ok) { if (svc_chan_userd(vgpu, ch, rrc ? 0 : ring_pa, rrc ? -1 : ring_ap, &put, &get, |
