diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-27 16:08:54 -0400 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-27 16:08:54 -0400 |
| commit | f6e8a70fd4288d6fa11aa67a4d2a0e9a50f534dd (patch) | |
| tree | df1b2312959643b70b2d65a2c41d8859ee686a14 /kernel/main.c | |
| parent | 896d3e406f409ce4e80e5682ea3666de55a13158 (diff) | |
| download | open-iov-f6e8a70fd4288d6fa11aa67a4d2a0e9a50f534dd.tar.gz open-iov-f6e8a70fd4288d6fa11aa67a4d2a0e9a50f534dd.zip | |
vgsp: X/GL frame-pacer mirror (sema_xw_mirror) - unblocks the 10s/frame stall
r861 evidence: the X server's present path spins in a 10s-timeout wait
((EE) NVIDIA(GPU-0): WAIT (2, 8, 0x8000, <stuck 0xd4..>, <driver counter
+0x70/frame>)) comparing (progress_word & 0x3ffff) << 2 against its own
submitted-byte counter; the progress word (lone u32 0x140235 in an
otherwise-zero guest page) never advances because the emulation does not
execute the 2D method streams -> glxgears 0.09 FPS. A gdb write of the
word to 0x140000 | (counter >> 2) made the wait complete in 3 ms
(WAIT (0, ... <equal>, <equal>) immediately after the timeout print) and
silenced all further timeouts. This adds a 3 ms kthread that mirrors the
driver's counter word into the progress word; both guest PAs are injected
per boot via the sema_xw_mirror parameter (0,0 stops). Demo-path tuning
aid; no product logic depends on it.
Diffstat (limited to 'kernel/main.c')
| -rw-r--r-- | kernel/main.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/kernel/main.c b/kernel/main.c index a034b44..0e9452b 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -3097,6 +3097,38 @@ module_param_cb(sema_vidmem_dump, &nv_vgpu_sema_vidmem_dump_ops, NULL, 0200); MODULE_PARM_DESC(sema_vidmem_dump, "Dump emulated vidmem (addr,len) to the kernel log"); /* + * X/GL frame-pacer mirror (SESSION 148 perf): mirror the X server's + * submitted-byte counter (guest PA) into its GPU-progress word (guest PA) + * so the driver's per-frame 10 s wait completes in milliseconds. + * echo 0x112345678,0x112345000 > .../parameters/sema_xw_mirror + * echo 0,0 > .../parameters/sema_xw_mirror (stop) + */ +static int nv_vgpu_sema_xw_mirror_set(const char *val, + const struct kernel_param *kp) +{ + char buf[64]; + char *comma; + u64 cnt = 0, mem = 0; + + strscpy(buf, val, sizeof(buf)); + comma = strchr(buf, ','); + if (!comma) + return -EINVAL; + *comma = '\0'; + if (kstrtoull(buf, 0, &cnt) || kstrtoull(comma + 1, 0, &mem)) + return -EINVAL; + + return gsp_sema_service_xw_mirror(cnt, mem); +} + +static const struct kernel_param_ops nv_vgpu_sema_xw_mirror_ops = { + .set = nv_vgpu_sema_xw_mirror_set, +}; + +module_param_cb(sema_xw_mirror, &nv_vgpu_sema_xw_mirror_ops, NULL, 0200); +MODULE_PARM_DESC(sema_xw_mirror, "Mirror X frame counter (cnt_pa,mem_pa; 0,0=stop)"); + +/* * Debug: search the whole emulated vidmem for an 8-byte pattern: * echo 0x0000000400000001,16 > .../parameters/sema_vidmem_find */ |
