Disable handle_basic behind the deferred-release-outlives-its-syscall issue, and run userdev_dma_fault on a binary with no census - #571
Conversation
… issue The census instrument reds it the same way it reds handle_kill_policy, handle_transfer and kill_while_blocked: one extra live PipeWrite behind after handle churn, the last round's drop(write) still in the release queue at the second reading. A flaky test is disabled at once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
|
Review of #571 at
Net: +11/−0. One line is redlist data and ten are issue prose. BLOCKER
NOTE
REMOVE
SEND BACK |
… runs in Fast userdev_dma_fault carried test_rs_handle_basic and required exit 0 after the staged DMA fault. With handle_basic disabled behind deferred-release-outlives-its-syscall, its census arm still ran there, on the actuator kernel, and a release-queue lag would have read as "the guest ran after the fault and failed" - an IOMMU fault-survival regression it is not. What userdev_dma_fault needs from its binary is a process that the machine spawns after the fault and that exits 0. log_origin is the smallest built binary that runs standalone and exits 0 with nothing staged (661104 bytes; the smaller ones panic, segfault, hold the boot for a host, or paint the screen), and it is on RUST_SKIP, so no shared-boot declaration is needed. handle_basic is no longer driven by any machine test, so its DRIVEN_AND_SHARED entry goes, as suite_split requires. The issue records the assertions handle_basic alone held, which now run in no gate, and that its exit brings them back. The review's REMOVEs are taken. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
|
Review round 2 of #571 at Net Earlier findings
BLOCKERNone. NOTE
REMOVE
LAND AFTER NAMED CHANGES |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
…it, and it omits log_stream_e1000e Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
#571's removal of `handle_basic` from `DRIVEN_AND_SHARED` merges on its own, since the list is back in `tests/toyos.rs` byte for byte as main had it. `kernel-loom/tests/i8042_tally.rs` takes main's side whole: #567 moved every loom model onto a fork that races a store against every thread's last load, and asserts that the tally models reach their named cases, so this branch's reordering and its `explored` guard, which worked around the gap, go. The branch's issue about that gap (`loom-never-moves-a-store-before-a-load-another-thread-made-first`) closes with it, since #567 meets its exit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
Takes #567, #570 and #571 at af817e5. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
The orchestrator's nightly at 925e1a6 red it on netd's "this NIC's claim refused an interrupt read: Io" from Card::begin_pass, 22 ms after the staged DMA fault. That panic is netd's designed answer to a claim the kernel refuses after a fault, and the test forbids it, so the test passes only while netd has not reached its loop. Neither this branch, which changes neither netd nor logd and captures fewer lines for this test than main, nor #571 caused it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
Summary
handle_basicreds on the same mechanism already tracked forhandle_kill_policy,handle_transferandkill_while_blocked: the per-kind object census finding a live object behind after a release that has been queued but not yet run.4919fbd7:handle_basicred attests/toyos-rust-tests/src/bin/handle_basic.rs:305, sixteen more rounds of handle churn left one extra livePipeWritebehind ([("PipeWrite", 5, 6)]),PipeReadunchanged.wt/toyos-wv-fsatb10c4daf, green when run alone.PipeWrite+1,PipeReadunchanged — is the last round'sdrop(write)still in the release queue at the second census reading:issues/kernel/deferred-release-outlives-its-syscall.md's defect, not a new one.Decisions
handle_basicis disabled insrc/redlist.rsbehind that issue; a flaky test is disabled at once, never re-run. The evidence is a witness paragraph in the issue.userdev_dma_faultcarriestest_rs_log_origininstead oftest_rs_handle_basic. It ranhandle_basicwhole, census arm included, on the actuator kernel and required exit 0, so the same release-queue lag could still red the Fast tier there, reported as "the guest ran after the fault and failed" — an IOMMU fault-survival regression it is not. What the test needs from its binary is a process the machine spawns after the fault that exits 0.log_originis the smallest built binary that runs standalone and exits 0 with nothing staged; the smaller ones panic, segfault, hold the boot for a host, or paint the screen. It is onRUST_SKIP, so no shared-boot declaration is needed; itsRUST_SKIPcomment now namesuserdev_dma_faultamong its drivers.handle_basicleavesDRIVEN_AND_SHARED: no machine test drives it any more, andsuite_splitreds on a stale entry.dup2's generations and a spent slot's retirement run in no gate whilehandle_basicis disabled, and the issue's exit brings them back by re-enabling it.Gates (host, run here)
cargo test --lib: 384 passed, 0 failed, 1 ignored — exit 0cargo test --test toyos-build -- --list: exit 0; prints[toyos] disabled: handle_basic — issues/kernel/deferred-release-outlives-its-syscall.mdand listsuserdev_dma_faultcargo run -- --known-red handle_basic:handle_basic: YES, disabled — it does not run.— exit 0cargo run -- --build-only: exit 0Guest arms (orchestrator's measurements, at
6c3af992)userdev_dma_faultEXIT=0, passing withtest_rs_log_origin;suite_splitEXIT=0 (no guest; it readsDRIVEN_AND_SHAREDagainst the harness).draininkernel/src/arch/x86_64/vtd/fault.rscounting every fault rather than onlyowner.is_none()ones, soiommu-userdev-foreign-dma's fault takes thehalt_all_cpuspath. The mutated tree builds (cargo run -- --build-only --kernel-param iommu-userdev-foreign-dma, exit 0); the patch is not committed. Run against it,userdev_dma_faultEXIT=1: "the guest stopped answering after the fault: QEMU disconnected", after the fault itself was delivered (DMA FAULT owner=slot0) — the half the carried binary answers.log_ring_keeps_the_owners_slots, already disabled onmain.intel-iommufault recording, which is whatforeign_faultalready reads the fault from.🤖 Generated with Claude Code
https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j