7bd0818792
Surfaced during Phase 7 verification on ohm:
1. **OUTPUT pool stale-slot bug (src/surface.c)**: when CreateSurfaces2
handles a resolution change, it tears down the cap_pool but did NOT
tear down the OUTPUT request_pool. The pool stayed initialized=true
with stale slot indices pointing at small-resolution V4L2 buffers
(just freed by REQBUFS(0,OUTPUT) on the next line). Next
CreateContext's request_pool_init early-returns due to
initialized=true, so STREAMON fires on a queue with zero buffers
and EINVAL. Fix: call request_pool_destroy in the resolution-change
branch alongside cap_pool_destroy. Mirror the cap_pool teardown.
Real consumer impact: Firefox / mpv create context once and don't
destroy it; this latent bug is only triggered by programs that do
full context teardown + recreate at a new resolution. Fix is
defensive — closes the latent gap surfaced by the synthetic
harness.
2. **cap_pool_probe_pattern.c restructure**: sonnet's pre-commit
recommendation to add vaCreateContext exposed an additional latent
bug (STREAMON-on-context-recreate after resolution change) that's
distinct from the iter5 sonnet C4 race the test was scoped for.
Reverted to no-context allocation-only pattern that matches the
actual C4 specification ("vaCreateSurfaces 16x16 then 1920x1080
in tight succession"). The new STREAMON bug is logged as iter8
candidate.
3. **run_cap_pool_probe.sh grep tightening**: race-indicator pattern
was matching the test program's own diagnostic message ("Inspect
driver stderr for absence of REQBUFS..."). Now grep restricts to
lines starting with "v4l2-request:" prefix.
Phase 7 results (clean iter7 driver sha 54999017... + this fix):
- Track A (msync verify): 100 frames byte-for-byte SW=HW (sha
58c8f3f4...) -> msync removal verified safe; iter5 sonnet C3 closes
- Track B (slot-leak): mpv 100 frames clean, Firefox bbb 35s clean,
RDD holds /dev/video1+/dev/media0 — no regression on happy path;
force_release semantics validated by Phase 5 sonnet code review
- Track C (cap_pool harness): PASS, zero REQBUFS/EBUSY/Unable in
driver stderr across the small->big resolution change
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
54 lines
1.6 KiB
Bash
Executable File
54 lines
1.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# run_cap_pool_probe.sh — orchestrate the cap_pool probe-pattern regression test.
|
|
#
|
|
# Runs the cap_pool_probe_pattern test program with the v4l2_request driver
|
|
# and grep-checks driver stderr for race indicators. Exits 0 on PASS, 1 on FAIL.
|
|
#
|
|
# Usage: ./run_cap_pool_probe.sh [path_to_test_binary]
|
|
# If no argument, looks for ./cap_pool_probe_pattern in the same directory.
|
|
|
|
set -eu
|
|
|
|
BIN="${1:-$(dirname "$0")/cap_pool_probe_pattern}"
|
|
|
|
if [[ ! -x "$BIN" ]]; then
|
|
echo "FAIL: test binary not found or not executable: $BIN" >&2
|
|
echo "Build it first:" >&2
|
|
echo " gcc -O2 -Wall -Wextra -o $BIN $(dirname "$0")/cap_pool_probe_pattern.c \\" >&2
|
|
echo " \$(pkg-config --cflags --libs libva libva-drm)" >&2
|
|
exit 2
|
|
fi
|
|
|
|
LOG=$(mktemp -t cap_pool_probe.XXXXXX.log)
|
|
trap 'rm -f "$LOG"' EXIT
|
|
|
|
env LIBVA_DRIVER_NAME=v4l2_request \
|
|
LIBVA_V4L2_REQUEST_VIDEO_PATH=/dev/video1 \
|
|
LIBVA_V4L2_REQUEST_MEDIA_PATH=/dev/media0 \
|
|
"$BIN" >"$LOG" 2>&1
|
|
rc=$?
|
|
|
|
echo "--- test program output ---"
|
|
cat "$LOG"
|
|
echo "--- end output ---"
|
|
|
|
if [[ "$rc" -ne 0 ]]; then
|
|
echo "FAIL: test binary exited with rc=$rc" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Race indicators on driver-prefixed lines only (avoids matching the
|
|
# test program's own informational output). Driver log lines start with
|
|
# "v4l2-request:".
|
|
race_lines=$(grep -E '^v4l2-request:' "$LOG" \
|
|
| grep -iE 'REQBUFS|EBUSY|Unable to request buffers|Unable to set format' \
|
|
|| true)
|
|
if [[ -n "$race_lines" ]]; then
|
|
echo "FAIL: driver stderr contains race indicators:" >&2
|
|
echo "$race_lines" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "PASS: cap_pool probe-pattern test clean (no race indicators)."
|
|
exit 0
|