<feed xmlns='http://www.w3.org/2005/Atom'>
<title>open-iov.git/kernel/main.c, branch stallfree</title>
<subtitle>Open-IOV vGPU-IO: host-side GSP emulation for unmodified NVIDIA guest drivers
</subtitle>
<id>https://git.vgpu.io/open-iov.git/atom?h=stallfree</id>
<link rel='self' href='https://git.vgpu.io/open-iov.git/atom?h=stallfree'/>
<link rel='alternate' type='text/html' href='https://git.vgpu.io/open-iov.git/'/>
<updated>2026-10-18T19:30:38+00:00</updated>
<entry>
<title>vgsp: fail4 r231 - READ-ORDER guard/witness + 32KB copy-resolution witness</title>
<updated>2026-10-18T19:30:38+00:00</updated>
<author>
<name>Arthur Hanson Rasmusson</name>
<email>arthur@vgpu.io</email>
</author>
<published>2026-10-18T19:30:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vgpu.io/open-iov.git/commit/?id=54a41db23985a82654ad4daeca283682e2b14b1e'/>
<id>urn:sha1:54a41db23985a82654ad4daeca283682e2b14b1e</id>
<content type='text'>
r231 probe: RAWA (fresh 64 KB upload -&gt; straight D2H readback, no kernel)
returned foreign deterministic content (0x437F0000-family ramps) where the
uploaded ints 0..16383 must be, and PROBE2 == PROBE2B on that same content.
The upload/readback round trip inside the emulation is therefore not
content-preserving - before any engine execution. Two candidate mechanisms,
both now witnessed:

- READ-ORDER: a device-src copy reading a VA whose device-dst write is
  still inside the m169 pin-guard window (the writer's bytes land only when
  the guard resolves) - the read executes first. READ-ORDER-WIT logs the
  coincidence; with sema_read_order_guard=1 (new param, default 0) the read
  is deferred through the existing bounded-hold re-decode so it runs after
  the write. Opt-in pending an A/B proving no green regression.

- RESOLUTION DIVERGENCE: the dst (H2D) resolution consults the ledger
  before svc_op_translate while the src (D2H) resolution does the opposite,
  so a stale ledger landing can make the writer and reader touch different
  pages. The sema-bigcopy proof (va-&gt;pa/aperture/provenance for BOTH sides)
  now fires from 32 KB (was 1 MB), so the probe-class copies are on record.

Build green; module param registered and visible.

(cherry picked from commit bfe5d295dd3922c0dbcd0bd1a29912a02acb58ec)
</content>
</entry>
<entry>
<title>vgsp: fail4 discrimination tooling - copy-out page witnesses + full-boot bigcopy resolution budget</title>
<updated>2026-10-18T16:10:03+00:00</updated>
<author>
<name>Arthur Hanson Rasmusson</name>
<email>arthur@vgpu.io</email>
</author>
<published>2026-10-18T16:00:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vgpu.io/open-iov.git/commit/?id=04aad03adc45683d03fe1451b8f234061e6b88ff'/>
<id>urn:sha1:04aad03adc45683d03fe1451b8f234061e6b88ff</id>
<content type='text'>
Four guest CUDA clients fail all-bad while four pass; the aggregate
counters cannot separate 'engine result never produced' from 'produced
but written to a different guest page than the client's read resolves'.
Add the two per-page witnesses that correlate the write side with the
read side:

- gsp_phys_gr_copyout_dump (booter, default 1): per-changed-page
  OUT-PAGE-WIT va=&lt;device VA&gt; hpa=&lt;guest PA written&gt; first8/last8=&lt;bytes
  shipped&gt;, bounded 12 pages per launch, plus one RELOC-CENSUS line per
  launch (gaps vs late-resolved words vs late pages).
- sema_bigcopy_log (sema service, default 24, was a hardcoded per-boot
  budget): the svc_copy large-copy proof already logs both operands'
  resolved VA -&gt; pa/aperture/provenance and the first 16 bytes each side;
  raising the budget past the boot's head makes the failing clients'
  H2D/D2H resolutions visible.

Discrimination test for the next cycle: same device VA on OUT-PAGE-WIT
(copy-out HPA) and sema-bigcopy (D2H source pa) with different PAs proves
the produced-but-misplaced class; equal PAs redirects to the readback
content/engine-input path.

(cherry picked from commit 78ea8b7807231ac418a17b85c29ed1845e1b0062)
</content>
</entry>
<entry>
<title>vgsp: GR fill hold param-gated (default 0: log-only, never hold); record-destroyer root-cause notes</title>
<updated>2026-10-18T10:50:21+00:00</updated>
<author>
<name>Arthur Hanson Rasmusson</name>
<email>arthur@vgpu.io</email>
</author>
<published>2026-10-18T10:49:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vgpu.io/open-iov.git/commit/?id=fdef24a4999f9699a1143d0d73eab226b36c0035'/>
<id>urn:sha1:fdef24a4999f9699a1143d0d73eab226b36c0035</id>
<content type='text'>
</content>
</entry>
<entry>
<title>vgsp: GR fill hold - absolute deadline + expiry-proceed + dropped-page detail</title>
<updated>2026-10-18T10:19:43+00:00</updated>
<author>
<name>Arthur Hanson Rasmusson</name>
<email>arthur@vgpu.io</email>
</author>
<published>2026-10-18T10:17:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vgpu.io/open-iov.git/commit/?id=e99040b9ca2acc10a9d4b57fe45626331e203a7c'/>
<id>urn:sha1:e99040b9ca2acc10a9d4b57fe45626331e203a7c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>vgsp: m178 GR launch reliability + diagnostics; tools: pin latching robustness</title>
<updated>2026-10-17T23:18:50+00:00</updated>
<author>
<name>Arthur Hanson Rasmusson</name>
<email>arthur@vgpu.io</email>
</author>
<published>2026-10-17T23:18:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vgpu.io/open-iov.git/commit/?id=33de4c9bc524ac27582fde5911ad32d89d0a7de9'/>
<id>urn:sha1:33de4c9bc524ac27582fde5911ad32d89d0a7de9</id>
<content type='text'>
Kernel: authorship instrumentation + swrel gate for in-flight GR release VAs;
first-poll shortening + fast extended re-arm (params gr_retry_fast=1,
gr_first_poll_ms=2500); per-attempt win0 bank recompute + shadow recopy in the
outcome-retry loop; poll-break/deposit-readback diagnostics; C1-C10 sema
diagnostics (crel-entry, relx, opdef-clear, walk, pub-adv, hold-fallback,
busy-defer, CAND-OVERWRITE, inline recs); busy-defer hold instead of
software-release consume; counter fast path; QMD word 48/49 skip.
Tools: heartbeat thread, scanner-alive probe on reinstall, full periodic
re-assert, #nopid handling, per-client reset fix (debounce), dead-pid drop,
supervisor grace+threshold.
</content>
</entry>
<entry>
<title>vgsp: m169 stale device-destination guard (device-dst copies translated only by walk/RAM-scan are held until a pin confirms; r172 streams2_diag stream-1 H2D wrote through a stale walk entry while the launch read the true page) + session-scope the op-trace budget + bigcopy witness covers device-dst copies &gt;=64KB</title>
<updated>2026-10-17T02:03:28+00:00</updated>
<author>
<name>Arthur Hanson Rasmusson</name>
<email>arthur@vgpu.io</email>
</author>
<published>2026-10-17T02:03:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vgpu.io/open-iov.git/commit/?id=419615dc4e1fa5e9c2b4e0d15a0df94ca163a09b'/>
<id>urn:sha1:419615dc4e1fa5e9c2b4e0d15a0df94ca163a09b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>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</title>
<updated>2026-10-17T00:54:49+00:00</updated>
<author>
<name>Arthur Hanson Rasmusson</name>
<email>arthur@vgpu.io</email>
</author>
<published>2026-10-17T00:54:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vgpu.io/open-iov.git/commit/?id=b90ced5aa52d202e678918093d1bb497ec1efd2b'/>
<id>urn:sha1:b90ced5aa52d202e678918093d1bb497ec1efd2b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>vgsp-dual: stage B+C minimal per-mdev separation (G1-G3, G5, G6, G7, G8a)</title>
<updated>2026-10-15T21:53:52+00:00</updated>
<author>
<name>Arthur Hanson Rasmusson</name>
<email>arthur@vgpu.io</email>
</author>
<published>2026-10-15T21:53:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vgpu.io/open-iov.git/commit/?id=81c11ca09adf85bd314f7406a8e0d7d637726a80'/>
<id>urn:sha1:81c11ca09adf85bd314f7406a8e0d7d637726a80</id>
<content type='text'>
Goal 1.0: two mdevs + two QEMU guests running CUDA simultaneously.
Single-mdev behaviour is kept identical: the legacy guest-RAM record
still serves the first/only open mdev, the channel table degenerates to
the historical key, and the session flush fires at the same
last-channel-closed transition.

- G6: guest-RAM backing {file, path, ranges} per mdev (legacy record +
  up to 4 vgpu-bound records); debugfs gsp-phys-guest-ram accepts an
  mdev UUID as an extra first token and keeps the 4-token form; records
  released on mdev cleanup and physical release.
- G7: gsp_phys_gpa_to_hpa_vgpu(vgpu, gpa, *hpa); NULL keeps the
  historical first-open resolution. Forwarding operands pass the
  request's vgpu; the single-guest boot-ladder pin passes NULL.
- G1: the sema-service thread services every open mdev each pass.
- G2: channel table keyed by (vgpu, h_object); per-guest ranks;
  counter/scrub/opdef/pump snapshot+writeback matches per vgpu;
  scrubber records per guest.
- G3: per-guest session records drive the flush; the shared learned
  tables (staged G4) are only flushed when no guest has live channels.
- G5: hold/abort keyed by (vgpu, handle); dead-owner guards on the
  hold resolution paths; single-inflight serialization kept.
- G8a: guest-GPA pin refused while more than one mdev is open.

Build: make -j8 clean success (vgsp.ko). No module load. See
DUAL-REPORT.md for the per-item status and live-validation plan.
</content>
</entry>
<entry>
<title>vgsp-sema: author the PMA scrubber channel's progress (third-client scrub freeze)</title>
<updated>2026-10-14T15:39:30+00:00</updated>
<author>
<name>Arthur Hanson Rasmusson</name>
<email>arthur@vgpu.io</email>
</author>
<published>2026-10-14T15:39:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vgpu.io/open-iov.git/commit/?id=624438bb0901680f416b879727b30a411dd3d78b'/>
<id>urn:sha1:624438bb0901680f416b879727b30a411dd3d78b</id>
<content type='text'>
The guest PMA scrubber (in-guest CeUtils CE channel, 4096 GPFIFO entries)
waits on its channel buffer's finish payload (offset 0x6c004) after the
third CUDA session's pages must be scrubbed; nothing in the emulation
authored it, so cudaMalloc froze in scrubCheckAndWaitForSize.

- channel_add: detect the 4096-entry scrubber channel and stash its USERD
  PA/ring geometry (the channel itself is left untouched: no rank change,
  no pump change - the colliding numeric-handle FREE may still unregister
  it, the geometry survives).
- sema_scrubbuf_add debug param: register the finish/host-semaphore word
  PAs the guest scanner resolves (vmallocinfo + kcore walk), because the
  RM kernel VA space collides numerically with the client CE window in the
  global VA map and cannot be resolved through it.
- svc_scrub_pass (service thread, per pass): from the channel's own USERD
  GPPut, track submitted scrub blocks across wraps, then author USERD
  GP_GET = put, host semaphore = put and finish payload = submitted.
  Forward-only, idempotent, zero writes while the scrubber idles.

Live-validated mechanism (r137 VM): authoring the finish word at the kcore-
resolved PA let the frozen victory_matmul leave scrubCheckAndWaitForSize
and proceed to its launch.
</content>
</entry>
<entry>
<title>vgsp: m143 (1.0 P1) - 2GiB turing type, BAR1 size = fb_emul_size, script accepts -1g/-2g</title>
<updated>2026-10-08T01:21:50+00:00</updated>
<author>
<name>Arthur Hanson Rasmusson</name>
<email>arthur@vgpu.io</email>
</author>
<published>2026-10-08T01:21:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vgpu.io/open-iov.git/commit/?id=6ac6a426cdbf81b443b6554d5f2cada4a8a0d479'/>
<id>urn:sha1:6ac6a426cdbf81b443b6554d5f2cada4a8a0d479</id>
<content type='text'>
</content>
</entry>
</feed>
