diff options
Diffstat (limited to 'tools/guest-diag')
| -rw-r--r-- | tools/guest-diag/guest_pin_stream.py | 23 | ||||
| -rw-r--r-- | tools/guest-diag/pin_gr_stream.py | 14 |
2 files changed, 36 insertions, 1 deletions
diff --git a/tools/guest-diag/guest_pin_stream.py b/tools/guest-diag/guest_pin_stream.py index 3222a90..d8566c2 100644 --- a/tools/guest-diag/guest_pin_stream.py +++ b/tools/guest-diag/guest_pin_stream.py @@ -316,6 +316,17 @@ _area_off = {} # zero pages included); cleared when the area disappears (context rebuild). _gl_fam = {} +# SESSION 153-r1397b: strict-validated window pins are re-emitted every few +# seconds. The one-shot emission loses pages: a burst can be dropped under +# host load, and the `done` latch then means the lost pages are never +# retried - the 60216 B GL setup push needs all 15 pages, so one missing +# page keeps the whole entry unreadable (r1397: pages 0x4007000..0x4009000 +# re-landed via the loose path but 0x400a000..0x400e000 never did; every +# 60216 B read answered src=255 unreadable=1 and the entry was skipped). +# The pairs are content-validated, so a repeat is idempotent; the host +# re-asserts GL-family pairs on receipt. epage -> [pairs, next_ts]. +_strict_reemit = {} + def resolve_va_by_content(kc, va, out): """Demand pin: find the page carrying GPU VA 'va' by content match. @@ -2581,6 +2592,12 @@ def main(): got = got2 if ok and got: lines.extend(got) + # SESSION 153-r1397b: keep re-emitting this + # content-validated window so a page lost in + # burst delivery heals without waiting for a + # new resolution (see _strict_reemit). + _strict_reemit[epage] = [list(got), + time.time() + 4.0] for g in got: try: _want_state["done"].add( @@ -2592,6 +2609,12 @@ def main(): else: _want_state["strict_pending"].setdefault( epage, now_d) + _rr_now = time.time() + for _epg in list(_strict_reemit): + _pairs, _nxt = _strict_reemit[_epg] + if _rr_now >= _nxt: + lines.extend(_pairs) + _strict_reemit[_epg][1] = _rr_now + 4.0 # Loose VAs in a family whose strict anchor is still # pending are deferred to the strict path only. pend_bases = set() diff --git a/tools/guest-diag/pin_gr_stream.py b/tools/guest-diag/pin_gr_stream.py index 35c2ea3..b2ba9b8 100644 --- a/tools/guest-diag/pin_gr_stream.py +++ b/tools/guest-diag/pin_gr_stream.py @@ -675,7 +675,19 @@ def _flush(runs, seen, full=False): # 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 + # + # SESSION 153-r1397b: the GL setup-push families get the same + # treatment. The guest re-emits a strict-validated 60 216 B window + # every ~4 s because a burst can be partially dropped under host + # load and the `done` latch otherwise never retries the lost pages + # (r1397: pages 0x400a000..0x400e000 never landed; every 60216 B + # entry read answered src=255 and the push was skipped). Without + # this exception the unchanged re-emits were dropped here. + gl_win = ((0x4000000 <= va < 0x4160000) or + (0x4200000 <= va < 0x4300000) or + (0xcc80000 <= va < 0xcc90000) or + (0x6f00000 <= va < 0x6f10000)) + ce_win = 0x120000000 <= va < 0x122000000 or gl_win if not full and not ce_win and seen.get(va) == pa and n == 1: continue todo[(va, pa, n)] = True |
