diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-12 15:48:29 -0400 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-12 15:48:29 -0400 |
| commit | f3cd10e0bdf5f4379c57f048d7e589612f8ac6e1 (patch) | |
| tree | 63b365848c5b56ec58f7ac2fd30e7027b516c432 /kernel/gsp_sema_service.c | |
| parent | fc9aad2d7af5cce804ee27260e2ae865bcd85898 (diff) | |
| download | open-iov-f3cd10e0bdf5f4379c57f048d7e589612f8ac6e1.tar.gz open-iov-f3cd10e0bdf5f4379c57f048d7e589612f8ac6e1.zip | |
vgsp-sema: bounded sema-norel diagnostic for readable CE pushes without a release
The entries the pump holds for the 8 s CE grace are exactly the ones whose
decode found no release. Under SEMA_DBG this logs the decode state
(have_sem, rel va/payload, ops) and the first 64 push bytes for every
content-bearing CE push that decoded no release (2048-line budget,
all-zero reads are filtered so they cannot wash it out). Used in r129 to
show that a push whose tail crosses the CE page boundary reads 0xFF
garbage for its second page - the sem+LAUNCH_DMA live exactly in that
tail, so only boundary-crossing pushes were undecodable.
Diffstat (limited to 'kernel/gsp_sema_service.c')
| -rw-r--r-- | kernel/gsp_sema_service.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c index 9ab609a..45a9843 100644 --- a/kernel/gsp_sema_service.c +++ b/kernel/gsp_sema_service.c @@ -602,6 +602,14 @@ struct sema_svc { u64 grce_log; /* GRCE inline-write budget */ u32 cur_ch; /* channel of the op being run */ u64 entry_log; /* per-push summary budget */ + /* + * m151: bounded log for CE pushes that were READABLE (nonzero first + * bytes) yet decoded no release. These are the entries the pump holds + * for the 8 s grace; naming their decode state (have_sem, rel) and + * head bytes is the Class-2 diagnostic (r128: correct content, right + * sem block at +0xC0 with RELEASE_ONE_WORD, yet rel_seen false). + */ + u64 entry_norel_log; u64 ops_denied; /* work refused: implausible stream */ u64 false_trans; /* resolvable VA mapped to non-push */ u64 sem_write_reresolve; /* writes re-resolved after read-back */ @@ -6936,6 +6944,36 @@ static void svc_decode_stream(struct nv_vgpu_device *vgpu, const u8 *buf, tlen ? tail : NULL); } } + + /* + * m151 Class-2 diagnostic: a CE push with real content that decoded no + * release is the one that pays the 8 s grace. Log its decode state + * (bounded, content-gated so all-zero reads do not wash it out). + */ + if (gsp_sema_dbg && ch->engine_type && ch->h_object && !st.have_rel) { + u8 head[64]; + u32 hlen = len < sizeof(head) ? len : (u32)sizeof(head); + bool nz = false; + u32 i; + + for (i = 0; i + 4 <= hlen; i += 4) { + u32 w; + + memcpy(&w, buf + i, 4); + if (w) { + nz = true; + break; + } + } + if (nz && svc.entry_norel_log < 2048) { + svc.entry_norel_log++; + memcpy(head, buf, hlen); + pr_info("sema-norel: h=0x%x eng=%u va=0x%llx len=%u ops=%u have_sem=%u rel=0x%llx pay=%u head=%*phN\n", + ch->h_object, ch->engine_type, push_va, len, + ops_runs, st.have_sem, st.rel_va, + st.rel_payload, hlen, head); + } + } } /* ------------------------------------------------------------------ */ |
