summaryrefslogtreecommitdiffstats
path: root/tools/guest-diag/pin_gr_stream.py
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-16 20:54:49 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-16 20:54:49 -0400
commitb90ced5aa52d202e678918093d1bb497ec1efd2b (patch)
tree56d7f2d81803484165ed9994a50f57e8301d9202 /tools/guest-diag/pin_gr_stream.py
parent9ae857d0fa7e9123928dc3cc189d19691b5deb32 (diff)
downloadopen-iov-b90ced5aa52d202e678918093d1bb497ec1efd2b.tar.gz
open-iov-b90ced5aa52d202e678918093d1bb497ec1efd2b.zip
vgsp: m163 lost-H2D copy integrity (drain injected pins before CE op resolution; hold failed device-copy ops) + m164 CLASS-2 GR no-capture entry hold + m165 pool release applies at fresh-pin time + m166 timeout-ladder warm-sem fail-fast; scanner: first-class pool VA resolution + periodic re-assert + demand routing
Diffstat (limited to 'tools/guest-diag/pin_gr_stream.py')
-rw-r--r--tools/guest-diag/pin_gr_stream.py11
1 files changed, 7 insertions, 4 deletions
diff --git a/tools/guest-diag/pin_gr_stream.py b/tools/guest-diag/pin_gr_stream.py
index e1f5195..dff2d2d 100644
--- a/tools/guest-diag/pin_gr_stream.py
+++ b/tools/guest-diag/pin_gr_stream.py
@@ -145,7 +145,7 @@ def _demand_loop():
except Exception:
continue
now = time.time()
- for m in re.finditer(r"stalled VA #\d+: (0x[0-9a-f]+)",
+ for m in re.finditer(r"(?:stalled VA #\d+|pending release starved va)=(0x[0-9a-f]+)",
(r.stdout or "")[-200000:]):
va = int(m.group(1), 16)
track.setdefault(va, [now, 0.0])
@@ -258,14 +258,17 @@ def _flush(runs, seen):
"""
todo = []
for va, pa, n in runs:
- # The CE window (0x120000000..0x121000000) is re-asserted by the
+ # The CE window (0x120000000..0x121000000) and the UVM semaphore
+ # pool page range (0x121000000..0x122000000) are re-asserted by the
# guest every couple of seconds on purpose: the host's session flush
# wipes the whole pin table when the previous client's last channel
# closes, and a pin batch that raced in for the new client must be
# allowed to land again even when the pair is unchanged. Skipping
# repeats there stranded the second client's CE pushes (the r144/
- # r145 stall: sema-probe "NO ENTRY" for the live push pages).
- ce_win = 0x120000000 <= va < 0x121000000
+ # r145 stall: sema-probe "NO ENTRY" for the live push pages) and the
+ # pool/tracker page (pending release starved, every client's first
+ # seconds).
+ ce_win = 0x120000000 <= va < 0x122000000
if not ce_win and seen.get(va) == pa and n == 1:
continue
todo.append((va, pa, n))