diff options
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, |
