Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
81379ef
net(586 PR 3): require measured starvation for bounded wake extensions
ryanbreen Sep 7, 2026
290152b
net(586 PR 3): align marker census and tracing ratchet with formatted…
ryanbreen Sep 7, 2026
df9b819
docs(586 PR 3): record redo proofs and unresolved acceptance outcomes
ryanbreen Sep 7, 2026
0776f44
test(586): record delayed wake controls and contention revision prove…
ryanbreen Sep 7, 2026
87ccec1
docs(586): record R232 controls and remaining starvation blocker
ryanbreen Sep 7, 2026
21e3d98
docs(586): record R233 verify-only ruling and explicit non-claim
ryanbreen Sep 7, 2026
1283ba2
docs(net): reconcile R233 landing and retained 586 evidence
ryanbreen Sep 7, 2026
8674c93
Merge origin/main into net/586-pr3-guest-execution-budget-v2
ryanbreen Sep 7, 2026
2c8f4bb
docs(net): record blocked landing after strict preflight retry
ryanbreen Sep 7, 2026
d94ed14
docs(net): publish ignored landing gate and suite logs
ryanbreen Sep 7, 2026
f6f7414
Merge origin/main into net/586-pr3-guest-execution-budget-v2
ryanbreen Sep 8, 2026
a3786fe
test(586): refresh merged fixture from the strict boot gate
ryanbreen Sep 8, 2026
88caad3
docs(586): record merged-tip gates and service-profile red
ryanbreen Sep 8, 2026
e91d71e
Merge origin/main into net/586-pr3-guest-execution-budget-v2
ryanbreen Sep 8, 2026
240e0e8
test(586): refresh merged fixture from the strict gate
ryanbreen Sep 8, 2026
c27e24b
docs(586): record second merged-tip re-verification
ryanbreen Sep 8, 2026
b5f11b3
docs(586): correct bootstrap rejection and landing status
ryanbreen Sep 8, 2026
da88697
docs(586): preserve strict landing failure at b5f11b35
ryanbreen Sep 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
22 changes: 21 additions & 1 deletion docker/qemu/run-aarch64-boot-test-strict.sh
Original file line number Diff line number Diff line change
Expand Up @@ -413,12 +413,20 @@ require_boot_tests_kernel() {

# A census of marker literals rather than one sentinel: a single marker
# changing profile must not be able to disarm this guard quietly.
for marker in '[SCHED_STRAND_ORACLE:' '[STRAND_INJECT_ORACLE:' '[CENSUS_WIDEN_ORACLE:' '[FCNTL_PM_CONTENTION_ORACLE:' '[IRQ_HOLD_ORACLE:' '[UDP_LOCK_ORACLE:' '[UDP_PORTS_LOCK_ORACLE:' '[TTY_IRQ_PM_ORACLE:' '[TTY_IRQ_FG_ORACLE:' '[FUTEX_HANDOFF_ORACLE:' '[CTX596_ORACLE:' '[TOMBSTONE_JOIN_ORACLE:' '[TIMER_WAKE_LATENCY_ORACLE:' '[BOOT_TESTS:'; do
for marker in '[LOOPBACK_WAKE_BUDGET:' '[SCHED_STRAND_ORACLE:' '[STRAND_INJECT_ORACLE:' '[CENSUS_WIDEN_ORACLE:' '[FCNTL_PM_CONTENTION_ORACLE:' '[IRQ_HOLD_ORACLE:' '[UDP_LOCK_ORACLE:' '[UDP_PORTS_LOCK_ORACLE:' '[TTY_IRQ_PM_ORACLE:' '[TTY_IRQ_FG_ORACLE:' '[FUTEX_HANDOFF_ORACLE:' '[CTX596_ORACLE:' '[TOMBSTONE_JOIN_ORACLE:' '[TIMER_WAKE_LATENCY_ORACLE:' '[BOOT_TESTS:'; do
if ! grep -aqF "$marker" "$kernel" 2>/dev/null; then
missing="$missing $marker"
fi
done

# Fields are format-string fragments, separate from bracketed marker prefixes.
local field
for field in ':max_extensions=' ':extension_ms=' ':extension_bound_ms='; do
if ! grep -aqF "$field" "$kernel" 2>/dev/null; then
missing="$missing $field"
fi
done

if [ -n "$missing" ]; then
echo "Error: $kernel was not built with --features boot_tests."
echo " Missing boot_tests-only marker literal(s):$missing"
Expand Down Expand Up @@ -539,6 +547,18 @@ score_serial() {
echo "Boot test failure: ${boot_test_fail_line:-[TEST:<missing>:FAIL:<missing>]}"
return 1
fi
# A dispatch/wake failure is fatal even before the aggregate summary arrives.
if grep -qE '\[TEST:network:loopback_recv_wake_(when_idle|under_load):FAIL:' "$serial_file"; then
echo "Loopback wake test failed"
return 1
fi
local wake_test
for wake_test in when_idle under_load; do
if ! grep -qE "\[LOOPBACK_WAKE_BUDGET:arch=aarch64:test=$wake_test:budget_ms=200:elapsed_tick_ms=[0-9]+:elapsed_ctr_ms=[0-9]+:ctx_delta=[0-9]+:extensions=[0-4]:max_extensions=4:extension_ms=[0-9]+:extension_bound_ms=1000:.*:verdict=(ok|starved)\]" "$serial_file"; then
echo "Loopback wake budget marker missing or failed: $wake_test"
return 1
fi
done
python3 "$BREENIX_ROOT/scripts/score-softirq-deferral.py" "$serial_file" || return $?
if ! grep -qE "(breenix>|bsh |\[bwm\] Display:|\[bcheck\] Complete:|\[heartbeat\])" \
"$serial_file" 2>/dev/null; then
Expand Down
53 changes: 53 additions & 0 deletions docker/qemu/run-aarch64-starved-loop.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/usr/bin/env bash
# Repeat strict boots under host contention; a recovered starvation receipt is required.
# Usage: run-aarch64-starved-loop.sh [cycles=10] [hogs=14]
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
CYCLES="${1:-10}"
HOGS="${2:-14}"
for value in "$CYCLES" "$HOGS"; do
[[ "$value" =~ ^[0-9]+$ ]] || { echo 'cycles/hogs must be integers'; exit 2; }
done
(( CYCLES > 0 )) || exit 2
: "${BREENIX_GATE_TMP:?set a lane-unique absolute directory}"
[[ "$BREENIX_GATE_TMP" = /* ]] || exit 2
OUT="${BREENIX_STARVED_OUTPUT:-$BREENIX_GATE_TMP/starved-$(date +%Y%m%dT%H%M%S)}"
mkdir -p "$OUT"
OUT="$(cd "$OUT" && pwd)"
pids=()
cleanup() {
local pid
for pid in "${pids[@]}"; do kill "$pid" 2>/dev/null || true; done
for pid in "${pids[@]}"; do wait "$pid" 2>/dev/null || true; done
}
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
# The delegated strict gate owns the QEMU lock, QEMU PID and GATE_BOOT_FACTS.
for ((hog=0; hog<HOGS; hog++)); do
python3 -c 'while True: pass' &
pids+=("$!")
done
revision="$(git -C "$ROOT" rev-parse HEAD)"
printf 'revision=%s cycles=%s hogs=%s\n' "$revision" "$CYCLES" "$HOGS" | tee "$OUT/run.txt"
failed=0
recovered=0
for ((cycle=1; cycle<=CYCLES; cycle++)); do
cycle_dir="$OUT/cycle-$cycle"
mkdir -p "$cycle_dir"
rc=0
{
printf 'revision=%s cycle=%s hogs=%s\n' "$revision" "$cycle" "$HOGS"
BREENIX_GATE_TMP="$cycle_dir" bash "$ROOT/docker/qemu/run-aarch64-boot-test-strict.sh" 1
} > "$cycle_dir/gate.txt" 2>&1 || rc=$?
serial="$cycle_dir/breenix_aarch64_strict_1/serial.txt"
receipt=0
if [[ -f "$serial" ]] && grep -qE '\[LOOPBACK_WAKE_BUDGET:.*:test=when_idle:.*:extensions=[1-9][0-9]*:.*:verdict=starved\]' "$serial" && grep -qF '[TEST:network:loopback_recv_wake_when_idle:PASS]' "$serial"; then
receipt=1
recovered=$((recovered+1))
fi
(( rc == 0 )) || failed=$((failed+1))
printf '[STARVED_LOOP_FACTS:revision=%s:cycle=%s:hogs=%s:gate_exit=%s:recovered=%s]\n' "$revision" "$cycle" "$HOGS" "$rc" "$receipt" | tee -a "$OUT/run.txt"
done
printf '[STARVED_LOOP_RESULT:cycles=%s:failed=%s:recovered=%s]\n' "$CYCLES" "$failed" "$recovered" | tee -a "$OUT/run.txt"
(( failed == 0 && recovered > 0 ))
Loading