diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-08 04:15:24 -0400 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-08 04:15:24 -0400 |
| commit | c8ccdd772c7650f19d14f143f34b700813575746 (patch) | |
| tree | 9fe20baacabba4c06768adefda90f2877731f43b /tools/cuda-ab/p2/run_guest.sh | |
| parent | 862b075dac8becb98ad5bfe0d286bbb6d97a3be0 (diff) | |
| download | open-iov-c8ccdd772c7650f19d14f143f34b700813575746.tar.gz open-iov-c8ccdd772c7650f19d14f143f34b700813575746.zip | |
vgsp+guest-diag: kcore-truth pin resolver (pool/pushbuffer/channel ring+userd) + GR ring userd-derived candidates
guest_pin_stream.py now resolves translations entirely from guest truth via
/proc/kcore + a manual page-table walk (no QMP races): the CE semaphore pool
and pushbuffer memory from the UVM rm_mem structures, and each channel's
GPFIFO ring + GPPUT from the tracking semaphore's embedding uvm_channel_t
(channel_info located by its gpFifoGpuVa value). This removes the watcher
pipeline's flakiness on the cudaMalloc stall class (missing pool/pushbuffer
pins).
gsp_sema_service.c: svc_gr_ring_autopin tries the guest-registered USERD
memdesc base as a ring candidate (the fixed FB convention only matches when
the guest's VRAM allocator happens to reproduce the old layout), plus an
optional (gsp_sema_dbg) one-shot FB scan + raw-word diagnostics when every
candidate fails.
tools/cuda-ab/p2: self-checking arbitrary-kernel acceptance suite (10
programs: sequential launches, shapes, params, smem/GEMM, streams, malloc
churn, printf+error, FMA benchmark, mixed, managed probe) with host oracle
expectations and a guest runner.
Diffstat (limited to 'tools/cuda-ab/p2/run_guest.sh')
| -rwxr-xr-x | tools/cuda-ab/p2/run_guest.sh | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/tools/cuda-ab/p2/run_guest.sh b/tools/cuda-ab/p2/run_guest.sh new file mode 100755 index 0000000..0290df1 --- /dev/null +++ b/tools/cuda-ab/p2/run_guest.sh @@ -0,0 +1,161 @@ +#!/bin/bash +# SPDX-License-Identifier: BSD-3-Clause +# +# p2/run_guest.sh - push every P2 program into the running guest, execute it +# with a timeout, and compare its stable output lines against the recorded +# host-oracle reference in p2/expected/<name>.txt. +# +# Prerequisites: +# * p2/expected/<name>.txt exists (run p2/oracle.sh first) +# * the guest is running and reachable through scripts/vgpu_vm.py +# +# This talks to the live VM; run it only when no campaign cycle is using it. +# +# Usage: +# ./run_guest.sh # all programs +# ./run_guest.sh p2_seq5 ... # selected programs +# P2_GUEST_TIMEOUT=600 ./run_guest.sh +# +# Exit status: 0 only if every strict program PASSes (the managed-memory +# probe is informational: it must complete with STATUS OK, its content is +# recorded but not diffed). +set -u + +HERE="$(cd "$(dirname "$0")" && pwd)" +REPO="$(cd "$HERE/../.." && pwd)" +VMEXEC="${P2_VMEXEC:-$REPO/scripts/vgpu_vm.py}" +FILTER='^(RESULT|CHECK|ERR|STATUS|P2PRINT|PROBE|MAIL)' +TIMEOUT="${P2_GUEST_TIMEOUT:-300}" +INFO_PROGS=" p2_managed_probe " +GUEST_OUT="$HERE/guest" + +mkdir -p "$GUEST_OUT" + +PROGS=() +if [ "$#" -gt 0 ]; then + PROGS=("$@") +else + for b in "$HERE"/bin/p2_*; do + PROGS+=("$(basename "$b")") + done +fi + +if [ ! -x "$VMEXEC" ] && [ ! -f "$VMEXEC" ]; then + echo "ERROR: VM executor not found: $VMEXEC" >&2 + exit 2 +fi + +# Build any missing binaries first (bin/ may be absent in a fresh checkout). +need_build=0 +for name in "${PROGS[@]}"; do + [ -x "$HERE/bin/$name" ] || need_build=1 +done +if [ "$need_build" -eq 1 ]; then + "$HERE/build.sh" || exit 2 +fi + +for name in "${PROGS[@]}"; do + if [ ! -x "$HERE/bin/$name" ]; then + echo "ERROR: missing binary bin/$name - run p2/build.sh" >&2 + exit 2 + fi + if [ ! -f "$HERE/expected/$name.txt" ]; then + echo "ERROR: missing expected/$name.txt - run p2/oracle.sh" >&2 + exit 2 + fi +done + +ping="$("$VMEXEC" exec "echo VMPING" 2>&1 || true)" +if [[ "$ping" != *VMPING* ]]; then + echo "ERROR: guest not reachable via $VMEXEC (is the VM running?)" >&2 + exit 2 +fi + +push_bin() { + local name="$1" b64 total off size=70000 chunk out + + b64="$(base64 -w0 "$HERE/bin/$name")" + total=${#b64} + off=0 + "$VMEXEC" exec "rm -f /tmp/$name.b64" >/dev/null 2>&1 + while [ "$off" -lt "$total" ]; do + chunk="${b64:$off:$size}" + "$VMEXEC" exec "echo -n '$chunk' >> /tmp/$name.b64" >/dev/null 2>&1 + off=$((off + size)) + done + out="$("$VMEXEC" exec "base64 -d /tmp/$name.b64 > /tmp/$name && chmod +x /tmp/$name && rm -f /tmp/$name.b64 && echo PUSH_OK" 2>&1)" + [[ "$out" == *PUSH_OK* ]] +} + +declare -a R_NAME R_STATUS R_NOTE + +echo "== P2 guest acceptance: $(date -u +%Y-%m-%dT%H:%M:%SZ) ==" +echo "== timeout=${TIMEOUT}s, expected dir: $HERE/expected ==" + +for name in "${PROGS[@]}"; do + gs="$GUEST_OUT/$name.txt" + fail=0 + note="" + + if ! push_bin "$name"; then + R_NAME+=("$name"); R_STATUS+=("FAIL"); R_NOTE+=("push failed") + continue + fi + + "$VMEXEC" exec --timeout "$TIMEOUT" "/tmp/$name" > "$gs" 2>&1 + rc=$? + + if [[ " $INFO_PROGS " == *" $name "* ]]; then + if [ "$rc" -eq 0 ] && grep -q '^STATUS OK$' "$gs" && grep -q '^PROBE ' "$gs"; then + note="$(grep -m1 '^PROBE ' "$gs" | cut -c1-70)" + R_NAME+=("$name"); R_STATUS+=("INFO"); R_NOTE+=("$note") + else + R_NAME+=("$name"); R_STATUS+=("FAIL") + R_NOTE+=("expected-failure probe did not complete cleanly (rc=$rc)") + fi + continue + fi + + if [ "$rc" -ne 0 ]; then + fail=1 + note="guest exit=$rc" + fi + if ! grep -q '^STATUS OK$' "$gs"; then + fail=1 + note="${note:+$note; }no STATUS OK" + fi + + grep -E "$FILTER" "$gs" | LC_ALL=C sort > "$gs.filtered" + grep -E "$FILTER" "$HERE/expected/$name.txt" | LC_ALL=C sort > "$gs.expected" + + if ! cmp -s "$gs.filtered" "$gs.expected"; then + fail=1 + note="${note:+$note; }stable-line mismatch" + if [ ! -s "$gs.filtered" ]; then + note="${note:+$note; }no stable lines (timeout/hang?)" + fi + fi + + if [ "$fail" -eq 0 ]; then + R_NAME+=("$name"); R_STATUS+=("PASS"); R_NOTE+=("") + else + R_NAME+=("$name"); R_STATUS+=("FAIL"); R_NOTE+=("$note") + fi +done + +echo +printf '%-22s %-6s %s\n' "PROGRAM" "RESULT" "NOTES" +printf '%-22s %-6s %s\n' "----------------------" "------" "-----" +any_fail=0 +for i in "${!R_NAME[@]}"; do + printf '%-22s %-6s %s\n' "${R_NAME[$i]}" "${R_STATUS[$i]}" "${R_NOTE[$i]}" + [ "${R_STATUS[$i]}" = "FAIL" ] && any_fail=1 +done +echo + +if [ "$any_fail" -ne 0 ]; then + echo "P2: FAIL (guest output in $GUEST_OUT, diffs: *.filtered vs *.expected)" + exit 1 +fi +echo "P2: PASS ($((${#R_NAME[@]})) programs; guest output in $GUEST_OUT)" +exit 0 |
