| Commit message (Collapse) | Author | Age |
| |
|
|
| |
viawalk retry outcome (walk rc, pa, plausibility) - session 124 evidence: for the GR submit push 0x4ca0000 the read returns rc=0 src=4 (trusted) even AFTER the user VAS registers and walk_probe rc=0, yet NO viawalk row and NO decode row appear and the entry skips after ~250 rescues: the entry is consumed between the read and the decode (plausibility passed but the decode never ran, or an earlier branch took it) - next: witness the branch taken after the read (plausibility verdict, injected/zero_nop/displaced flags)
|
| |
|
|
| |
(h/va/len/rc/winning-src, budget 400/client, reset in svc_session_flush) at the pump read site plus the r707x src out-param (svc_read_last_src) inside svc_read_va_push_ex; also per-client reset of the sema-pushfail budget. r713: the run reproduced VKDEVICE+flips+VKFAIL but the witness rows scrolled out of the 2 KB dmesg ring before capture - the next run must read dmesg immediately after the first skips (or raise the ring buffer)
|
| |
|
|
| |
DIRECT registered-VAS walk (svc_walk_vaspaces + svc_read_ap, the exact path walk_probe proves) instead of svc_lookup_trusted - whose pin/lat hits would answer with the same wrong page again; r711/r712 evidence: the user VAS registers and walk_probe rc=0, the rewind replays, but the retry/log never appears and the entries still skip after ~250 failed rescues (the sema-pushfail witness budget is per-boot and was exhausted earlier, so the read-failure detail was invisible this boot)
|
| |
|
|
| |
(r707e) - the r710 boot shows the host content-located trigger registers the user VAS and the walk resolves (walk_probe va=0x4ca0000: vas[3] h=0xfade0002 pdb=0x101d63000 -> rc=0 pa=0x11fa20000), while the pump's own svc_lookup pair only registered the three internal VASes (all rc=-2); the working order is: content-located trigger FIRST (registers the user VAS), then sema_chan_rewind so the replay re-reads the entries with the working VAS
|
| |
|
|
| |
moment any channel's ring resolves through the channel object, so the user-VAS page directory can register BEFORE the submit's first push reads (the host-triggered path could not win that window: a failed GR entry read is never retried with the fresh VAS); r709 evidence: three VASes registered (h=0xc/0xbaba0042/0xcaf00000, pdb=0x11b8db000/0x11b8e6000/0x11b8ef000) and walk_probe still rc=-2 for the client's push VAs - the registered directories do not cover the user VAS, so the content-pair verify against the ring must still land for that one
|
| |
|
|
| |
-> clears slot_done_epoch + last_get + the per-entry rescue state so entries skipped before the VAS pdb anchor re-decode) + bounded per-chunk push-read failure witness (sema-pushfail: va/chunk/page/last_rc/trusted_rc/ipin/alt/win per failed chunk); wall2: runbook.py (trigger the anchor then rewind). Session 118: the anchor+rewind path is wired; the automated rewind scheduler missed (dmesg churn) and the pushfail trace still needs one clean capture
|
| |
|
|
| |
verify the parked COPY_SERVER_PDES candidates against a content-verified ring pair, then fall back to the vidmem walk-root sweep) + runtime-tunable candidate age-out (sema_vas_cand_ms; the default 15 s ages the client's VAS candidate out exactly when its channels first register, so the verified walk can never anchor it by itself)
|
| |
|
|
| |
(wall2_fb_compr_mb, default 128 MiB) - the guest driver attempts a COMPR-enabled 64 KB-aligned comptag allocation (vendor VidHeap alloc attr COMPR=2, r703 live: the last vidheap call returns NV_ERR_NO_MEMORY 0x51) and libcuda maps that to VK_ERROR_OUT_OF_DEVICE_MEMORY (the vkAllocateMemory -2 that gates the first Vulkan frame); 0 restores the historic no-compression reply for A/B
|
| |
|
|
| |
0x90960106/0x90960107 (legacy NVOS32 VidHeap API) - libnvidia-eglcore walks three heaps and treats an all-zero reply as 'no memory' (the flag byte at entry+0x30 == 0 skips every heap), so vkAllocateMemory failed -2 without any alloc reaching the emulation; replies are runtime-tunable (wall2_9096_lo/hi/ent_addr/ent_size/ent_type/ent_flag) for a one-boot sweep
|
| |
|
|
| |
(NUM_COPY_BLOCKS) - the >=4096 test also matched every client channel (32768 entries in this driver version), so the pass authored for whichever client channel registered last while the real scrubber's finish payload stayed zero (the vkAllocateMemory -2 gate, r701 live evidence: slot held h=0xbeee0102/entries=32768 and the pass logged 'scrub author put=0')
|
| |
|
|
| |
channels that fail the userd/va condition were silent), pass idle/read-fail/junk-put logs; the r697 session proved the direct authoring works (fin/host sema advance unblocks scrubCheckAndWaitForSize permanently) but the in-service pass never fired
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
decode in both release forms (0x5c-form and SET_REPORT_SEMAPHORE)
The GR/GL ucode init pushes carry their releases on the RM's low aperture
(the same 0x4000000-0x4ffffff VA family as the push/ring windows): the
live GL init push decodes as rel=0x4b19b10 pay=1 (REPORT_SEM group
200426c0 00000000 04b19b10 00000001 10000000) and rel=0x4b17bb0 pay=3 /
0x4b17e30 pay=1 (0x5c-form 2005c017 04923060 ...), all rejected by the
sysmem-only SEMA_VA_LO bound - the NvOgl engine-init wait then spun
forever. With the bound relaxed (and the push windows injected via the
window-record/memdesc recipe) the releases decode live (have_rel=1,
applied rising) and the un-translated ones queue in svc_pending (417 at
the observed steady state) awaiting the semaphore-VA translations.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
NV01_EVENT_KERNEL_CALLBACK_EX (0x7E) events alongside OS_EVENT (0x79)
The driver's modern nvkms/Vulkan path allocates its per-channel
completion events with class 0x7E (nvos.h NV01_EVENT_KERNEL_CALLBACK_EX;
observed live as GSP_RM_ALLOC class=0x7e paramsSize=24 hParent=<subdevice>
hObject=0xcaf00003 from the second RM client while its main thread sat in
the vkCreateDevice wait loop, whose readiness word lives in a
/dev/nvidiactl notification page that only an event completion can
signal). The event registration scanned the params for hClass 0x79 only,
so 0x7E allocations were never registered and their completion wake-ups
(post_channel_event/post_all_events) could never reach them. Accept all
three event classes; the NV0005_ALLOC_PARAMETERS layout is the same
{hParentClient, hSrcResource, hClass, notifyIndex, data}.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
tunables (wall2_a097_count/rec0..rec7, default 0xffffffff = echo) and the evidence set that re-questions the a097 gate
The real host RM 0x2080a097 handler (GSP-RM 570.144 control table entry,
params 0x490) overwrites params+4..+0x23 with up to four {u32,u32}
mode pairs (engine value + a x1000 clock/percent) and the client copies
back the first 16 bytes; the tick at eglcore 0xd5e3e0 consumes the
second word of the first pair as the per-engine progress (session
+0xe104, compared against per-boot config threshold 95 at
lib+0x2019320+0xffc with 10/20 bit-history cutoffs). New module params
let one boot sweep the record matrix; the r680 sweep (flag/v488/v48c +
count/rec matrix incl. progress 100..1000000) changed nothing
observable, and hw watchpoints show E+0x150 stays 0x00200000 with no
writer over 5+ minutes while the a097 poller is a worker thread and
the main thread sits in a 10 s poll() loop on /dev/nvidia0 inside
vkCreateDevice. Tools: t75g.py (in-guest gdb state/watch probes),
diag76.py (thread bt + address resolution), slots_probe.sh, run75g.sh;
README-session76.md records the firmware handler decode and the sweep.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The guest Vulkan client (libnvidia-eglcore) issues RM control 0x2080a097 in a
~1.8 s retry loop while its engine-readiness check stays negative; the
bare-metal oracle (same client on the host with the real driver) never issues
it, so it is a vGPU-only path (engine type 0xe00101). The handler echoes the
1168-byte in/out record block and applies three module parameters -
wall2_a097_flag/v488/v48c - so one boot can sweep reply variants without
rebuilding (the client reads params +0x204, +0x488, +0x48c back; file offsets
0xecd45f..0xecd475 in libnvidia-eglcore.so.570.144).
Sweep result so far: flag=1 with v488=0 or 1 does not stop the retry; the
readiness wait lives in the client's engine loop (0xd6ef40..0xd6f0ab polling
byte +0x1b038 of the engine object, recomputed by a91ea0 from engine-state
fields), so the missing state is deeper than the reply words.
|
| |
|
|
| |
(wall-2 forensics aid - the r670 capture proved zero unknown RPCs and no mapping RPC during the client's vkCreateDevice attempts, so these dumps are bounded evidence tools for the next wall)
|
| |
|
|
| |
per-engine context geometry captured from the GSP on the physical backend - the client queries ZCULL geometry (engineId=8) at the end of every vkCreateDevice attempt and the generic all-zero reply failed its ZCULL-context buffer allocation (VKFAIL -3); with the handler the client proceeds through GR_CTXSW_ZCULL_BIND, GR_SET_CTXSW_PREEMPTION_MODE, VRAM allocs and MAP_MEMORY_DMA to the GR channel kick
|
| |
|
|
| |
one-head/8-window model (feHwSysCap head-0, windowPresentMask 0xff, numDispChannels 81 for the cursor channel numbers) - live gdb pinned the 0x56 to kdispGetChannelNum_v03_00 requiring windowPresentMask&NVBIT32(instance) for dispChnClass_Win and HEAD_EXISTS for Curs; + INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES (displayMask=1 numHeads=1; dispswConstruct rejected every head against numHeads=0); + NVC370_CTRL_CMD_GET_CHANNEL_INFO reports IDLE immediately (nvRMSyncEvoChannel polls 2s for IDLE after every kickoff)
|
| |
|
|
| |
one head (GET_NUM_HEADS 0x730102, GET_ALL_HEAD_MASK 0x730287, flexible window assignment 0x7302ad) and one static TMDS/HDMI connector on display id 0 (GET_SUPPORTED 0x730107, OR_GET_INFO 0x73028b SOR+SOR_SINGLE_TMDS_A, GET_CONNECTOR_DATA 0x730250 HDMI_A, DFP_GET_INFO 0x731140); the generic all-zero replies made nvkms log 'No heads found on board!' and fail (killing Xorg ScreenInit and Vulkan vkCreateDevice), then fail NoValidDisplays() after the heads were added
|
| |
|
|
| |
r639 streams2 transcript has the readback's acquire giving up at waited_ms=28378 while the launch whose release it waits for only forwarded ~9 s later (watermark defer + arg-partial defer + backend poll chained past the 25 s bound), so the readback ran out of order and the client read zeros (bad=65534); 45 s keeps >15 s of headroom under the clients' >= 60 s timeouts and only engages while a GR forward is unoffered (green boots never reach it)
|
| |
|
|
| |
whose unconsumed head entry is wait-gate held is a consumer-side wait, not a producer backlog; the watermark skips it while the candidate's operands are fully resolved and no decoded device write is pending, so the deferred launch forwards and its release installs (the r612/r636 streams chain: readback acquire op=3 pay=N sits behind the very launch whose release it wants, the two defer each other for the full 15 s cap and the copy runs ~20 s late); module param sema_mutual_skip (default 1, 0 = r636 behaviour)
|
| |
|
|
| |
per-shadow-page REAL-content tracking (r->content set on every landed write) anchors a client's own H2D-shadowed pages and arms a launch-level content anchor, so an answerless output candidate (contiguous tail of a shadowed input, or a non-contiguous allocation) is served from a bounded synthetic page set (1024/candidate, 4096/launch, 3/4-table guard) instead of failing the launch closed; synthetic pages can never re-anchor (the first draft self-fed on its own minted pages and filled the shared table to the guard - 6144/8192 measured on a green boot - content gating restored 0 minted pages there and the historical green shape); trusted pin/walk/ledger answers keep the r633 anchored budgets and no longer arm the cross mint; fresh r636 boot: best-equal battery 9 OK / 2 clean FAIL / 1 HANG (streams2 bad=65534 - its H2D dsts are replay-denied, the GR forward defers on the CE stream-order watermark, degenerate refusal faults cleanly; streams_events hang->clean CUDA_ERROR via the auto-fault; smiley first-wait crawl)
|
| |
|
|
| |
raise the non-pool device-VA release-write log budget 512 -> 4096/boot - the r633b battery's streams2 spin (userspace, launches completed, QMD releases applied) needs the held records and the release target PA visible; the 512-line budget was exhausted by mid-battery and hid every later application
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
deliver them on the eventual forward (the r632 mail hang), gate synthetic shadow pages on an anchored span with per-episode budgets (the r632 junk-candidate flood), and name the release0 redirect cause
The r632 first boot's mail client spun forever in cudaDeviceSynchronize
after its vadd launch: the push-level tracking release (0x20480fff0
pay=112) never landed while the client's word stayed at 111, even though
the launch itself completed (GUEST GR LAUNCH OK) and its QMD release was
software-applied. Root cause: the release records (svc_fwd_rel[]) are
per-decode state (reset at the top of svc_decode_stream), and the two GR
hold paths (busy-defer hold, m150 data-stalled hold) break out of the
pump entry loop BEFORE the release block (hold-engage / inline apply)
runs - so a held launch's records are dropped at the pass boundary. The
eventual forward (queued from the capture ring at the defer cap, without
a re-decode of the entry) then engaged the release hold with whatever
records that pass happened to carry (often none, or another entry's).
Live evidence: read_proc_va on the spinning client - 0x20480fff0 = 111
(payload 112 never applied), 0x204827f74 = 6 (QMD release delivered);
host log - no sema-sw line for 0x20480fff0 val=0x70 anywhere.
Fix (parked releases, keyed by vgpu/channel/push VA): both hold paths
park the pass's records (svc_grpark_put) before their break; svc_gr_request
restores the queued push's parked set into svc_fwd_rel[] at the consume
point so the pump's hold-engage holds exactly those records; the two
fail-closed REFUSED paths deliver the parked set inline; the session
flush clears the table. Bounded log line "GR parked releases restored"
(32/boot). Proven live: r633 first boot restored push=0x20043c1c8
n=1 va0=0x20480fff0 pay0=100; r633 mail now completes (VADD bad=0
checksum=12204516.000000, STATUS OK) on two consecutive fresh boots.
Also r633: the r632 synthetic shadow caps were per-FILL-CALL and the fill
re-runs on every retry pass, so one probe=none junk argument candidate
could mint another 1024 synthetic pages per pass - the 8192-page shadow
table filled within seconds of the r632 first launch (va-shadow
8192/8192, all synthetic, from the two 16 MB guessed spans of candidates
no resolver ever answered), which then killed the lane for every later
real page ("shadow table full ... write dropped"). Two changes:
- ANCHOR GATE: a synthetic page is created only when the candidate's
span already has >= 1 page answered by ipin/resolve/ledger. Existing
H2D shadow content still serves unconditionally (the red-draw chain),
and a real buffer's unresolved tail stays anchored by its resolved
head. A candidate whose every page is answerless takes the
historical drop path - its guessed span is not a buffer;
- PER-EPISODE BUDGETS: the per-candidate (1024) and per-launch (4096)
caps now persist per (push VA, span base) across the episode's
passes, not per call.
Measured r633: shadow table peak 2048/8192 (vs 8192/8192 full), 32
synthetic pages for the mail launch (vs 4041 junk-inflated n_data), the
lane stays available for content serves.
Diagnostics (bounded, one boot of evidence): "vgsp-work: gr-rel0 ..."
names the release0 resolution chain (rel_pa/ap/hpa/word/pay/unobs) and
"vgsp-gr: qmd-rel redirect: ..." names the backend redirect cause. The
first live reading answers the release-target question: rel_hpa resolves
(0x2fc495000), map_ret=0, unobs=0 - the redirect is the deliberate
gsp_phys_rmcall_gr_rel_mod=1 default (m64 forced module-semaphore
release), not a resolver failure. The r632 hang was the push-level
release loss, fixed above.
Build clean (kernel + r65535 warnings only).
|
| |
|
|
| |
shadow lane (existing H2D content, or a synthetic page for an argument candidate under per-candidate/per-launch caps) instead of dropping them - the submit build hands the shadow page's host address to the bounce machinery, so copy-in stages the client's own bytes and copy-out writes the engine's results into the same page the D2H copies read (red-draw chain: walk=none -> H2D shadow -> fill fail-closes -> degenerate refusal -> SYNTH-FAULT); write guard keeps a shadowed VA's writeback; sema_no_shadow=1 keeps the historical drop path
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
landings - the r623c wrong-write site
The post-loop parity store (r254-era) recorded a large virtual-destination
copy's whole range contiguously (dst + po) AFTER the per-page loop had
already stored each page's true resolved PA (m180/r391). For a scattered
UVM host buffer the contiguity guess overwrote the true entries; the next
copy of the same VA then followed the poisoned ledger (the non-pin DIVERGE
branch keeps the ledger) and wrote client c-data into guest pages the
kernel had since re-used.
r623c evidence chain (saxpy D2H readback of 0x70e64e700000):
sema-ledger: rewrite va=0x70e64e77f000 old=0x12e700000 new=0x115800000
504x sema-ledger: DIVERGE write ... prev=0x1158xxxxx cur=0x12e7xxxxx
guest panic: kchannelGetGfid_IMPL+0x12, garbage 0x44560800445590f0
(IEEE754 floats 854.25/856.125 = client c-data in nvidia channel structs)
Fix: the parity pass skips pages the per-page loop already stored (lookup
guard); it only seeds pages the loop did not reach. True per-page landings
are never overwritten.
|
| |
|
|
| |
(copy-dst + fill fallbacks hold instead); isolates the lane as a variable for the fatal corruption class (nvidia channel structs overwritten with PTE-like patterns -> panic in kchannelGetGfid_IMPL via nvGpuOpsStopChannel; r613c/r616/r623c)
|
| |
|
|
| |
engine-fault report to the guest's RM queue (debug param; payload mirrors the GSP ABI decode: exceptType/runlistId/chid/errString/prevXid) - the suspected missing recovery half after a synth-fault (post-fault clients stick pre-submission)
|
| |
|
|
| |
SVC_VAS_FLOOR and silently excluded the 0x200000000-0x20fffffff VAS window (the release words it exists for) - use the window base so the r618-style write-target divergence is actually logged
|
| |
|
|
| |
device-VA semaphore writes - the r618 hung math client read 0 at 0x20480fef0 while the host's deferred releases advanced cur 97..105 on its own target; this makes the write-target divergence measurable (bounded 512/boot)
|
| |
|
|
| |
error edge (notifier status=0xffff + channel event, sema_refusal_fault=1 default) - proven live by the r616 grfaultpoke test: the r616b matmul wedge ended with CUDA_ERROR unspecified launch failure instead of spinning forever; rollback = sema_refusal_fault=0
|
| |
|
|
| |
(relayed-fault shape: info32=except, info16=engine, status=0xffff, notifier_err latch) and post its channel event, to test whether a synthetic engine-error edge ends a refused launch's cudaDeviceSynchronize spin (the authored sw release lands - measured 0x6 - but the kernel never completes for a never-executed launch)
|
| |
|
|
| |
untruncate the arg-miss walk list - the r613b matmul wedge began with an H2D taking the shadow silently (no ledger/pin/walk) and the post-mortem could not see which registered pdb answered what (240B buffer, 3 of 8 entries)
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
the release sits behind our own launch deferral
The r34x acquire wait gate gives up (fail-open, ops run) after
gsp_sema_wait_hold_ms with no satisfiable value, on the premise that the
value cannot be installed by firmware alone. That premise is false while we
are holding the launch that authors the release: the r612 streams2 capture
gave up the D2H readback's acquire (ch=0x5c00005f va=0x20480ffe0 op=3 pay=4
cur=2 waited_ms=10333) while the vadd launches that release that semaphore
sat deferred by the CE watermark for the full 15 s cap; the readback then
ran BEFORE the kernels and the client read zeros (STREAMS bad=65534 even
with the launches forwarded and GUEST GR LAUNCH OK).
While any captured candidate is still unoffered (svc_gr_forward_pending),
extend the episode up to wait-hold + SVC_GR_DEFER_CAP_MS + 5 s margin and
log 'extend' instead of giving up. Every client-side timeout is >= 60 s, so
a <= 24 s episode cannot strand the client; when no forward is pending the
give-up is unchanged.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
stalled decoy candidates must not kill a launch whose real operands resolved
r586's fail-closed refused any launch still carrying unresolved argument
pages at the 15 s cap. streams2 as the first client of a fresh boot (r611)
shows the cost: its two launches carry candidates 0x783299000000 and
0x783297000000 that stall in EVERY source from the first fill (no pin, no
walk, no ledger; 'stalled VA' listed, never resolving in the run) while 969
real pages resolve, the r543 arg-defer is pre-empted by the CE watermark
defers, and at the cap both kernels are refused - STREAMS bad=65534 with the
engine never running.
Refuse only a degenerate fill (resolved < dropped - the r584 matmul shape, 2
resolved / 18 dropped, where the engine has no usable window). A
non-degenerate fill at the cap forwards historically and loudly
(fwd_gr_argfw witness): waiting longer cannot resolve a candidate stalled in
every source, and by this point every copy-related guard (dstpend, CE
watermark) has already had its chance and returned above when it fired.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- sibling launch rings caused mutual deferral
r607 made the CE submission watermark watch every other ring. That caught
the copy channel the r568 class needs, but it also caught sibling GR LAUNCH
channels, whose rings legitimately hold the client own future launches:
streams2s two stream channels (h=0x5c00001f/23) each saw the others
published entry as backlog, deferred for the full 15 s cap, and the r586
fail-closed then refused BOTH kernels (r610c streams2 as the first client of
a fresh boot: every launch REFUSED, STREAMS n=32768 bad=65534).
A channel that carries the client stream-ordered memory work is exactly a
channel that has decoded a transfer op; measured across r606/r609/r610c, ops
appear only on the 0x5c000059 copy family and the CE ranks, and the GR
launch channels decode none. Mark it in the op-append block (ever_ops) and
scope the watermark to those channels: the r606 red-draw copy channel stays
in scope, the sibling launch rings no longer defer.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
operand-pending - the held-chain livelock
The fail4 r302 block marks a denied device-destination copy op_tr_pending so
the m163/opdef hold retries it. It fires on EVERY decode pass with
allow=false - including a REPLAY pass, which is the pump re-walking an entry
whose ops were already recorded complete for this identity (entry_replay =
same && slot_ops_complete). The re-mark therefore un-completes a slot whose
copy HAS run: the next pass is fresh, re-executes the op, the next pin-batch
rewind re-marks it again - a replay/fresh/replay cycle that re-arms a 3 s
opdef hold every round and stalls the whole copy channel behind it.
Measured: 100% of the op_tr_pending marks in the r604-r609 boots came from
replay passes (27/27 in r609; 71/71 in r606, whose captured held chain
idx=90/92 is this shape; 72/72 in r608). In the r609 boot the d_b H2D entry
(idx=94) was re-marked and re-run every ~0.3 s from 368841 while the vadd
launch waited on it; the launch then hit the r586 fail-closed cap at 15 s
and the engine never wrote (VADD bad=32767 csum=0).
r308's rationale for the replay re-mark (pre-r595 the eng==0 copy channel's
fresh passes never admitted ops, so the re-mark was the only retry hatch) no
longer holds: r595's cap_trust admission runs a plausible copy on its fresh
pass, and a genuinely failed copy keeps its slot incomplete via op_owed / the
svc_run_ops rc!=0 pending rule. The whole denied accounting block (dstpend
note, staging re-snapshot, pending mark, hold) is now skipped on replay; a
fresh (non-replay) denied pass marks exactly as before.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
held-chain serialization
The m169 device-dst first-touch window is per PAGE, but the risk it covers
is per client table build. The driver's H2D relocation burst on the eng==0
copy channel writes N distinct first-write pages back to back; because the
pump holds the first held entry and the rest of the chain decodes only after
it drains, each page paid its own 3 s window, serialized (r606 red draw:
hold idx=90 362167.7->362170.8, idx=92 362177.7->362182.9, the b H2D entry
ran 362182.882, 326 ms AFTER the launch forward -> VADD bad=32735
csum=8139264, c = a + 0).
Every observed release logs 'without a pin': the pin the window waits for
never arrives for this class. After ONE un-pinned release on a channel, age
it (gsp_sema_copy_dst_age_ms, default 3000): further first-write device-dst
pages of that channel inside the window run immediately with the walk
translation - the exact translation the expired guard would have used
anyway. The first page of every burst still pays the full window; only the
N x window serialization is removed (~20 s of chain -> one window).
Keyed by h_object like every channel table and cleared by the session
flush (svc_dst_guard_reset; also clears the per-page slots, which are keyed
by VA alone and must not pre-age the next client's first touch - the r604
lifetime lesson). 0 restores per-page windows (pre-r609).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
engine_type!=0 (final form of r590b, on the r606 red-draw capture)
The r606 fresh-boot first mail client drew the classic red VADD
(bad=32735 csum=8139264, c = a + 0) with the peek armed, and the capture
names the blindness exactly:
362177.927 GR-DEC push=0x20043c394 dropped=9 partial=1 dstpend=0
copypend=0 ceback=0 defer_exp=0
362178.001 peek-backlog h=0x5c000059 eng=0 put=95 last=92
362182.145 peek-backlog h=0x5c000059 eng=0 put=95 last=92
362182.556 GR LAUNCH submitted (one-shot arg-defer retry)
362182.882 ce-soft-copy va=d_b executed - 326 ms AFTER the forward
-> VADD bad=32735 csum=8139264
The driver's H2D relocation copy sat three entries behind on the
COMPUTE-class channel h=0x5c000059 (eng=0) for 4.7 s, held by
'sema-pend: hold h=0x5c000059 idx=90 ... (operand pending)' - the wait
group (0x20480fff0 pay=84) passed every pass, so the only guard blindness
was the engine_type filter: ceback=0 while the copy channel was provably
behind. The r590 watermark now considers every other channel of the
device (the launching channel itself is excluded: its ring legitimately
runs ahead with future entries). Same pass snapshot, same bounded
busy-defer; this guard never refuses - the r586 fail-closed branch is
separate and fires only when argument pages never resolve. r595's
GR-class ops admission has since cut hold resolution to 0.5-4.7 s (the
captured 4.7 s), well inside the 15 s cap, so the deferral ends by
forwarding with the copy executed.
Companion to r605 (newest-registered-first walk within the class): r605
drains consumable published entries before the launch decision in the
same pass; r607 defers the decision while any other ring still holds
unconsumed entries (held chains included).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
stream-order fix completed (the write-pointer drain, by ordering)
The r507o stream-order fix (walk CE channels before GR ones) assumed the
client's H2D copies ride CE channels. r595 established they also ride the
compute-class channel h=0x5c000059 (eng=0), and r604 gave the decision-time
capture: at the vadd's second decision on a fresh boot,
'peek-backlog h=0x5c000059 eng=0 put=95 last=94' - the b-copy entry was
already written and PUBLISHED (GP_PUT ahead of the pump) while the launch
decision ran, invisible to every guard (the r590 watermark skips
engine_type==0; the r541/r568 gates only see DECODED copies). The pump's
stable partition walked the launch channel (registered early, 0x5c000019)
before the copy channel (registered later, 0x5c000059), so the copy was
consumed 8 ms AFTER the decision and ~320 ms before the launch's copy-in;
the run was green only because the partial-argument defer had stretched
the window. Pins landing one pass earlier would have forwarded against
the pre-copy page (c = a + 0, the r568 red draw).
Fix the order within the class: newest-registered first (descending
h_object) walks the driver's later-registered copy / push-library channels
before its compute channels, so every launch decision sees the copy ring
consumed to its live write pointer (GP_PUT) - the write-pointer drain, by
ordering. No deferral, no cap interaction, no speculative execution: the
pump still consumes each entry exactly once through its normal per-slot
identity bookkeeping (slot_ops_ident/done/complete/hash), so no identity
mirroring is needed. A client whose compute channel registers last keeps
the historical order (no worse).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
set incl. eng==0 copy channels
Two fixes, both from the SESSION 49 r603-family capture.
1. The r543 arg-defer latch and the r556 absolute defer cap are keyed by
push VA ALONE, and the UVM pool reuses the same launch push VAs for every
client of a boot - the exact lifetime bug the session flush already fixes
for the r565 exactly-once memories (svc_gr_cap_hist etc.). Carried across
sessions, the r556 stamp armed once at the previous client's first
sighting, so a new client's first decision for a reused VA already read
defer_expired()=true: every partial-argument defer failed closed (r586
path: QMD release authored in software, no engine launch) and the client
read stale/zero buffers. Witness (r603-family boot): the first mail
client (fresh VAs 0x20043be94/0x20043c364) deferred and launched (GUEST
GR LAUNCH OK ok=1/ok=2); every later mail client (VAs
0x20043beac/0x20043c37c reused) saw defer_exp=1 at its FIRST decision
with GR forward REFUSED at defer cap for both launches, and its 'green'
was the previous client's results still in the reused device pages.
Reset both tables with the session; within a session the original
bounds stand unchanged.
2. gsp_phys_gr_peek now logs every drained channel (cap 8 -> 24; the six
CE ranks came first and always spent the cap, so the eng==0
copy-carrying channels were never in the logged set - Session 48's 'the
copy channel's lookahead read empty' was an artifact of that), names the
channel's engine_type, deepens the lookahead to 6 slots, and logs
peek-backlog rows for channels whose live GP_PUT reads ahead of the
pass's consumed position (the r590 watermark skips engine_type==0, so a
published backlog on a GR-class copy channel is invisible to every
existing guard; the capture must show it).
r604 evidence (fresh boot, peek armed, mail first client): both launches
ran (ok=1/ok=2) and green; at the vadd's second decision
'peek-backlog h=0x5c000059 eng=0 put=95 last=94' - the driver's H2D
b-copy entry was already written+published on the eng==0 copy channel
and unconsumed, executed 8 ms after the decision and ~320 ms before the
launch's copy-in; zero write-ahead (+j) rows at any decision.
|
| |
|
|
|
|
|
|
|
| |
The r568 lever is the driver's ring WRITE pointer, not the GPFIFO put:
the b copy entry exists in the ring before the client publishes GP_PUT.
Add a bounded diagnostic (gsp_phys_gr_peek) that, when a channel reads
as drained, dumps up to four slots past last_get with {va,len} and
whether the slot already executed that exact entry - so the next fix can
be grounded in what is actually written ahead of the put.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
of the rebuilt window (default off)
The verbatim prelude replay breaks the launch (r599: qmd_rel=0 after an
8.9 s stall), so the acquire cannot be taken by replaying the prelude.
This takes only the wait method groups - C46F addr 0x5c count>=5 with
EXECUTE&7 != 1, and C5C0 SET_REPORT_SEMAPHORE A..D with a non-release op -
and copies them verbatim before the proven init+window+PCAS+release
block, leaving the window untouched.
Gate: gsp_phys_rmcall_gr_acq (default 0). Live A/B on r601: the mail
launch's prelude carries ZERO acquire groups (the C5C0 prelude is inline
parameter data + release only), so emitted=0 and the VADD race is
unchanged - the driver assumes its relocation copies precede the launch
without an engine-visible wait.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The r595 A/B could not be judged from the log: with prelude=1 the r593
boot never reached the build path (r590b deferred first) and no
geometry line existed. Print raw presence/raw_words/hdr/end/want_end for
the first eight prelude-gated launches so the gate is verifiable.
r599 measurement: raw=1 raw_words=210 hdr=138 end=205 want_end=205 -
the gate IS met; the verbatim prelude is replayed (words=205) but the
launch then completes with qmd_rel=0x00000000 after an 8.9 s stall
(engine never ran; software release), so prelude=1 breaks the launch.
|
| |
|
|
|
|
| |
ring, not engine_type!=0""
This reverts commit 668c22768abce559ab756f2f998260e08044a3d1.
|
| |
|
|
|
|
| |
forward (never refuse)"
This reverts commit 9333e84deed78464a7448c9faaf6841261a802d8.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
(never refuse)
With r595 the relocation copies execute within 0.5-1.5 s, but the r590b
watermark deferred through the shared 15 s cap; by then the r541/r583
dstpend guard took its fail-closed branch and refused a launch whose
data was already on its way (r596 mail MAILDUMP zeros, 2 refusals).
Track the settle start per push VA and defer only for
gsp_phys_gr_cewm_settle_ms (default 2000). Each deferral is one pump
pass and the pump drains the copy rings before the launching channel, so
the window is enough for the r595 copies; after it the launch forwards
with a witness. The guard can no longer reach any cap-refusal branch.
|
| |
|
|
|
|
| |
not engine_type!=0"
This reverts commit 64cca43699d6b74a1f2f2c5e087d33c7aba59de1.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
copies live on a compute channel
The r568 b-copy class is rooted in the op gate: allow_ops was
(ch->engine_type != 0), so a GR-class channel's own memory copies
(LAUNCH_DMA on h=0x5c000059, eng=0) never executed unless the push page
came from an injected pin. Their releases were still applied by the
op-hold path, the client's blocking cudaMemcpy returned, and the launch
read the pre-copy page (c = a + 0).
Admit ops when the push content is a plausible method stream - the same
content arbiter (cap_trust) that already gates GR launch capture - never
on a replay or a rehold. Measured: the d_a/d_b relocation copies now run
~0.5-1.5 s after the driver submits them instead of tens of seconds.
|
| |
|
|
|
|
| |
engine_type!=0"
This reverts commit f3225a81ca384248180d77f78c3614c73dcf289d.
|