summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_sema_service.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/gsp_sema_service.c')
-rw-r--r--kernel/gsp_sema_service.c34
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,