…nd the two debug timing rows ride shared-debug: 23 boots to 20 (#799)
Stage 3b of step B of the one-boot plan for the T14's metal rows: merge
boots. Stage 1 was #785, stage 2 #789, stage 3a #794. Head `01fd3aedd`,
which holds `main` at `558283168` (#797, with #796 under it) by a merge
with no conflict: in `tests/toyos.rs` `main`'s two hunks are the
`nvme_disk_keeps_log_and_home` machine test's row in `MACHINE_TESTS` and
its arm and function after `run_machine_test`, guest tests both, neither
in the `METAL` table nor near `shared_metal`; `tests/common/qemu.rs`
moved on `main` alone, and this branch does not touch it. `--metal
--list` is unchanged by it.
`--metal --list` before (`965e62bb1`): 61 registrations and 232 shared
members over **23** boots. After: 61 and 232 over **20**. `shared`,
`ccorpus` and `testcases-debug` are gone; no test is.
**The T14 read `2c7e1be1a`: 266 passed, 1 failed.** The red was this
merge's own: see the first decision. This head is staged and owed a
reading: see "The T14".
## What changed, per decision
- **`endowment_denied` holds a link against toybox's policy table only
where the link's target has a `[programs]` row.** The red at
`2c7e1be1a`: `"/system/bin/134_double_to_signed" is a link to something
else: a second multicall binary needs its own policy table, not this
one`, after every earlier phase passed. The member walks `/system/bin`
and asserted every link lands on `/system/bin/toybox`; the merged ROOT
carries the C corpus, whose 137 cases are links to the comparator
`test_rs_ccheck`, which reads `argv[0]` so the kernel records each run
under the case's name. On `shared`'s own ROOT there were none. **The
walk was too wide, and the corpus is not a second multicall binary in
the sense the claim is about.** What a link carries is its target's row:
the supervisor's `declared` follows one link and matches a row by its
whole path, and a target no row names is answered `NotDeclared`, which
the caller spawns itself with what it holds; the build's
`unnamed_program` says the same of every harness binary ("a harness
binary has none, holding only what its spawner moved in"), and
`test-runner` spawns every job directly in any case. A policy table
limits what a row grants; a binary with no row is granted nothing by
one. So the walk skips a link whose target the image's manifest names no
row for, matched by the whole path as the supervisor matches it (its own
parse of the manifest, as before), and a second binary that *does* have
a row behind a link reds as before. The applets line counts the links it
passed over. The corpus's shape is unchanged: one comparator under one
link per case is what lets a stick say which case failed. Nothing of the
endowment policy for C programs is decided here: the corpus's cases hold
what `test-runner` gives every job, as on `ccorpus`' own boot.
- **`shared` and `ccorpus` ride `testcases`.** Its list is the ten jobs
its rows name, then the 85 discovered Rust binaries, then the 137 C
cases, then the three bounds programs (`LAST_MEMBERS`), then `reboot`:
234 jobs, since `fault_gates` is a row's job and a member and runs once,
among the rows'. `c_corpus_metal` gives the corpus's part of that boot
and `shared_metal` puts the Rust members around it.
- **`testcases-debug` rides `shared-debug`.** `tlb_shootdown_waits` and
`trace_record_cost` name that boot, its kernel and its parameters, and
their two jobs run before its seven members.
- **A member says what it adds to its list's bound** (`metal::Member`),
where a shared boot said one number for all of its members: one boot now
carries Rust tests at 300 ms and C cases at 100.
- **A boot's last job ends its rows' jobs, and the members run behind
it.** This reverses what stage 3a built. `acpi_hold` gives up 54 000 ms
after boot (`UNTIL_MS`); behind the members it would have started 51.8
to 52.5 s in by the readings before the merge. On the T14 at
`2c7e1be1a`, before them, it started 43 095 ms into the kernel's clock
with 10.9 s left and exited 0. It also keeps the three bounds programs
the last jobs of the boot. **The compromise under it is filed, not
fixed**:
`issues/acpi-hold-gives-up-at-a-time-counted-from-boot-whatever-its-runner-was-given.md`,
owner the harness, exit the hold bounded from its own start or by the
bound its runner was given; it now carries the T14's start too.
- **Two jobs of one boot the kernel records under one name are
refused**, in `batches`, for every boot. The C corpus checked its own
cases; the merged list puts Rust members, C cases and rows' jobs under
one log, so the check is the boot's now and the corpus's own is deleted.
- **The judge prints a shared boot's members' time summed between each
member's own markers**, against what they add to the bound, and says
over how many: `its members took <ms> ms of the <ms> ms they add to the
list's bound, summed over the <n> of <all> with both markers`, and a
line `<k> without a start and an end marker, the first <job>` only where
there is one. It is a line a reader reads and reds nothing; no host test
holds it. On the T14: `9253 ms of the 40100 ms … summed over the 225 of
225`.
- **The record rows of `shared`, `ccorpus` and `testcases-debug` are
deleted** from the machine's record under `tests/metal/`. The three
`testcases-window` rows stay:
`issues/the-t14s-record-keeps-three-rows-of-a-boot-nothing-stages.md`
owns them and half its exit.
- **The allowance issue's exit is three parts**, by the orchestrator's
ruling on the round-1 review: (1) each allowance derived from the
members' sum between their own markers by one stated factor, the judge
redding a boot whose members' sum is past that share; (2) what a boot's
rows' jobs are given derived the same way from what they take, the judge
redding a boot whose rows' jobs end past their share; (3) `testcases`
reading both inside, the pair from the kernel's own lines, the margin to
the list bound beside them. None of it is built and the issue stays
open. Its present numbers are now the T14's reading of the merged boot,
beside the sum of the three boots it was.
## What the merged boots arm
`--metal --list` and the staging's own lines at `01fd3aedd`; the wait is
`metal::return_secs`' arithmetic. The T14 read the same pairs off the
kernel's own lines at `2c7e1be1a`.
| boot | jobs | `--bound-ms=` | `boot-deadline=` | hard-lockup bound |
`toyos-metal` waits |
|---|---|---|---|---|---|
| `testcases` | 234 | 100 100 (`main`: 60 000) | 200 200 (`main`: 120
000) | 100 100 (`main`: 60 000) | 501 s (`main`: 420) |
| `shared-debug` | 9 (`main`: 7) | 62 100, unchanged | 124 200,
unchanged | 62 100, unchanged | 425 s, unchanged |
100 100 is 60 000 for the rows' jobs, 88 members at 300 and 137 at 100.
No other boot's list, bound or deadline changes.
## The merged list against its bound, as the T14 measured it
`testcases` at `2c7e1be1a`, each part between its own markers, the
kernel's clock counted from its `Boot: complete (1135ms)` line; beside
it the sum of the three boots it was, three readings each (`testcases`
at `9e70cd2e3`, `473efea22`, `accbd79dd`; `shared` and `ccorpus` at
`eff8b20ee`, `d6d008e88`, `49e12f23b`).
| part | merged, `2c7e1be1a` | its parts apart | its share of the bound
|
|---|---|---|---|
| the boot, to its first job | 1 191 ms | 1 190 to 1 196 ms | |
| the rows' ten jobs | 41 924 ms, ending 43 115 ms in | 41 913 to 41 983
ms | 60 000 ms |
| the 225 members | 9 253 ms | 8 735 to 9 298 ms | 40 100 ms |
| the list's last record | 52 352 ms | 51 838 to 52 477 ms | 100 100 ms
|
Read per part, as
`issues/a-shared-members-allowance-sets-the-kernels-deadline-at-several-times-the-work.md`'s
exit reads: the members at about 4.3 times their work, the rows' jobs at
about 1.4 times theirs (`counters_metal` alone 32.7 s), the last record
47.7 s inside its bound, read by nothing. No part of that exit is met
and none is built: the issue stays open. Behind 42 s of rows' jobs the
members took 9 253 ms, inside what they took alone.
The loader at `2c7e1be1a`: ROOT read 9 301 ms, loader 13 069 ms, as the
measured rate predicted (30.5 ms/MiB to read, 7.1 to hash, a ROOT
partition of 305 MiB), under the firmware's 60 s. `shared-debug`: 176 ms
of members over 7 of 7, its last record 1 754 ms of 62 100 ms.
## Why each row can share its boot
Rows' jobs run first, so every row's own jobs see the machine
`testcases` gave them at stage 1: the same config, the same prefix, one
job at a time. What changes is what stands in the log, the page and the
census behind them. By what each judge reads:
| rows | what the judge reads | why 225 programs behind it cannot move
it |
|---|---|---|
| `blackbox_unclaimed_page`, `control_regs`, `ioapic_topology`,
`klogd_hosted`, `smp_roster_and_tsc_trail`, `pmm_accounting`,
`acpi_table_inventory`, `timer_calibration`, `pci_inventory`,
`loader_watchdog_arms`' control arm | the loader's file and kernel
records written before the first job | a kernel record is the kernel's
(`Readback::kernel` drops every program's line), and these are said at
boot |
| `wake_storm_cost`, `syscall_cost` | the job's exit record, and
`syscall_cost`'s own two lines | the first and fifth jobs of the list;
`exit_code` takes the lowest pid of a name, and a row's job is spawned
before any member |
| `audio_idle_suspend`, `hda_tone`, `hda_client_stall`,
`shipped_client_departures` | `job_window`: the log from the job's spawn
to its sessions' end, or to the next spawn | each window closes before
the hold. Two reads are boot-wide: no null sink, said at soundserver's
start, and no `repeated completion for free buffer`. The second gains no
stream: no member opens one on soundserver. `cpal_drop_unreleased` is
its own stream server (its header: "No sound is played and soundserver
is not involved"), and in the three `shared` readbacks soundserver says
nothing after its start |
| `counters` | `counters_metal`'s own lines by their `counters_metal
<phase>:` head; the idle second by stamp; no `acpi: legacy mode again`
in the boot | no member prints that head (none in six readings of the
member boots); the idle second is inside the job, which ends before the
first member starts; legacy mode returns only when the `acpi` claim's
holder goes, and no member holds or kills it (none in six readings) |
| `acpi_server_events`, `acpi_tables_loaded` | lines whose tag is
`acpiserver`, and boot records | a member's line carries the runner's
tag. The last count line is read with `rfind`: a boot that passes the
server's next interval prints a later one, also a count |
| `claim_reuses_its_remapping_entry` | every hand-over and release of
the I219, and every `iommu: irte` record whose source is it, counted:
two and two | no member claims a PCI function: `pci_reclaim` is on
`RUST_SKIP`, and six readings of the member boots carry no `handed over
on slot` |
| `domain_ends_below_the_host_bridges` | every `iommu: domain` record of
the boot | a domain a member's boot made is held to the same windows;
judged over the member boots' readbacks below |
| `crash_report_reads_no_kernel_memory` | three refusals `fault_gates`
stages, and no report line anywhere in the boot that carries a kernel
address's contents | members fault on purpose, and their reports are now
read too: a leak in any of them is the defect. Judged over `shared`'s
readback below |
| `irq_census_conservation` | the stop's census, off the page: every
device delivery on cpu0, every shootdown IPI counted by its issuer | the
census is the whole boot's, members included, and the rule is
conservation, not a count. Judged over the member boots' readbacks below
|
| `tlb_shootdown_waits` (to `shared-debug`) | its exit | every wait it
asserts is a floor (`elapsed >= FLOOR_NANOS`), which no load shortens.
The eleven self-tests run at init and on the first syscall of the boot
(`task_probes`, once), before any job |
| `trace_record_cost` (to `shared-debug`) | its exit and one printed
line | a million records written by one syscall with interrupts closed;
the number is printed and not recorded. On that boot each syscall pays
one atomic swap in `task_probes`; the flood is one syscall |
**The boot-wide judges, run over the member boots a machine has already
answered.** The `shared` and `ccorpus` readbacks of #794's third
reading, relabelled `testcases` and judged at `3055ab0d1` (`--metal
--metal-readback <dir>` with thirteen row names):
| readback | exit | |
|---|---|---|
| `shared`'s 88 members | 0 | 13 passed, `irq_census_conservation` (5
196 shootdowns, every delivery accounted for),
`domain_ends_below_the_host_bridges`, `acpi_tables_loaded` and
`crash_report_reads_no_kernel_memory` among them |
| `ccorpus`' 137 cases | 1 | 12 passed;
`crash_report_reads_no_kernel_memory` red for its premise, since
`fault_gates` did not run on that boot |
And the old readbacks under the new profile (`boot:testcases
boot:shared-debug` over stage 1's `testcases` and #794's
`shared-debug`): exit 1, every `testcases` row and every self-test row
PASS, 224 members and the two moved rows red as never run, which is what
those logs hold. `shared-debug` reads `its members took 176 ms of the
2100 ms they add`, the sum taken by hand above.
**The numbers each boot measures** are the boot's own
(`boot.testcases.complete_ms`, `panel_us`, `panel_max_us`): the kernel's
time to `Boot: complete`, before any job, and the panel's census, which
painted 10 times on `testcases`, `shared` and `ccorpus` alike. No row
riding these two boots records a number of its own.
**No row kept a boot for sharing's sake.** `mkdir_cap` and
`readdir_bound` keep theirs until stage 3c.
## The members that read machine-wide state
The red was a member reading something the merged ROOT changed. Each
other member whose source reads state another program moves, by `rg`
over `tests/toyos-rust-tests/src/bin` for directory walks, roster reads
(`SYS_SYSINFO` entries), the memory header and the log:
| member | what it reads | why the merged ROOT or population cannot move
its verdict |
|---|---|---|
| `std_fs` | `/system/bin`'s listing | asserts it non-empty and its own
binary in it: more entries cannot red it |
| `hierarchy_paths` | `/`'s listing against `ROOT_ENTRIES` | `/` is the
mount table, not ROOT's content; the corpus's `expect/` and binaries
land under `/system` |
| `toybox_file_tools` | its scratch directory for `.part` names; `/home`
for one name | each keyed on names it wrote itself ("other tests write
there in the same boot") |
| `empty_dir_stat` | `/tmp/empty_dir_stat_empty` | its own directory |
| `readdir_bound`, `mkdir_cap` | `/tmp`'s exact count; the VFS directory
cap, left full | the reason both ride boots of their own
(`testcases-readdir`, `testcases-mkdir`), unchanged here |
| `endowment_denied` | the roster in a 256-entry buffer, its own pid in
it; `ps`'s row count above zero | members run one at a time, so the live
set is the services and one member: `ps` counted 26 processes at
`2c7e1be1a`. Past 256 threads it would red "does not contain this
process", loud and misnamed; nothing near that |
| `kill_ends_every_wait` | the roster in 256 entries, one pid's state |
refuses past 256 by name |
| `process_tree`, `abuse_thread_name` | the roster in 1 024 entries,
filtered to names they spawned | keyed on their own names and pids |
| `audio_idle_suspend` | soundserver's threads in a 128-entry roster | a
rows' job: it runs before any member |
| `allocator_stress` | the memory header: used above zero and below
total | a sum of the whole machine against itself |
| `abuse_connect_flood` | the memory header before and after its own 32
connects, the growth under 32 MiB | the window holds its own syscalls;
ROOT is read into memory by the loader before the kernel starts, not in
the window. It is the first member, as on `main`'s `shared` |
| `shm_release_reclaims`, `handle_lifetime` | per-kind object counts |
their own headers: "per kind, and not the machine's free memory" |
| `inbox_log_post` | the log, until its own child's exit record | keyed
on its child's pid |
| `file_mtime` | its own file on `/log` | its own file |
No other member walks a directory it did not make, counts processes or
files, or reads a log line count. This is evidence for this list; a
member a later landing adds is held to the same question by its own
review.
## The log
The T14's `testcases` log at `2c7e1be1a`: 8 123 829 bytes, whole (no
part missing), where the sum of the boots it was predicted 8 095 744 to
8 130 458. Eight parts at logkeeper's 1 MiB a part; a fresh volume keeps
sixteen before `retire` deletes one of this boot's own continuations; a
part that is missing reds the whole boot by name (`bootlog::lost_parts`,
#785), unchanged.
## The T14
**At `2c7e1be1a`** (the orchestrator's reading; worktree clean before
and after, each image's sha256 checked in the command that flashed it):
three boots, each `toyos-metal` exit 0; judged with `--metal
--metal-readback <dir> boot:testcases boot:shared-debug`: exit 1, **266
passed, 1 failed**, `test_rs_endowment_denied` exit 101 as above.
Everything else as the request asked: the armed pairs 200 200 / 100 100
and 124 200 / 62 100 from the kernel's own lines; `acpi_hold` at the end
of the rows' jobs, exit 0; the bounds programs last; no bound fired;
each loader pass after the reset `DONE`; the members' line over 225 of
225. That reading is this change's negative control: the walk as it
stood, on a ROOT with the corpus's links, red.
**At `01fd3aedd`**: staged with `cargo test --test toyos-build --
--metal --metal-readback <dir> boot:testcases boot:shared-debug`, exit
2, which is "staged"; no machine touched. The images of `2c7e1be1a` were
gone already (the runner deletes each after its boot).
| boot | sha256 | bytes |
|---|---|---|
| `testcases` |
`d99c1440e52def650a5f9600cd75fe4283322db709d40f95fb12f181358003cd` | 429
916 160 |
| `shared-debug` |
`82c1d8aee120d02b9acee3af3245ec2f12d4d33abd81b664c1467cdd5299e43c` | 136
314 880 |
| `testcases-watchdog` |
`c296fb0c0b9b37e2617a1b371c442a78598c011436a320510cd5b818783f1ed4` | 119
537 664 |
The hashes stand in `request.txt` as `shasum -a 256` lines, and `shasum
-a 256 -c` over them answers OK for the three. The request names round
2's fourteen with this head's expected numbers, then: `PASS
test_rs_endowment_denied` with its line `applets: 15 links behind
/system/bin/toybox, 14 declared over-grants and no undeclared one; 137
links to a binary no row names` and the lines after it; and 267 passed.
Sent back by any FAIL or a count other than 267, an applets line with
other numbers, a bound or a `WEDGED`, a missing part, the hold at or
past 54 000 ms, another order, or a members' line over fewer than 225.
**A mutation boot, optional, staged beside it**:
`m4-a-second-binary-with-a-row-behind-a-link` (the patch is in the
round-3 comment) adds `bin/zz_second_multicall -> /system/bin/symbolize`
to `tests/testcases/system.toml`, `symbolize` having a row. Staged from
a never-pushed commit of it on `01fd3aedd` with `--metal
--metal-readback <dir> endowment_denied 134_double_to_signed`, exit 2,
the tree restored to `01fd3aedd` and clean after; one image of 134 217
728 bytes, sha256
`b6787c435359a87d68264f014fef286583667a9a73d8e93c8f91752b6db74d71`, its
config carrying both the C case's link to `test_rs_ccheck` and the
mutation's. Expected: exit 1, `test_rs_endowment_denied` red naming
`/system/bin/zz_second_multicall`: a second binary with a row behind a
link still reds. **No machine has run it**, and only a machine can: see
below.
## Where the tree differs from the design's text
- The design counts 24 boots to 21. `main` is at 23 (#794 was 25 to 23),
so this stage is 23 to 20.
- The design puts a boot's registered jobs first "in today's order" and
names no last job. Stage 3a built the last job behind the members; this
stage puts it back among the rows', on the measurement above.
- The design's merged boot arms "about 198 s"; the tree's formula gives
200 200 ms.
- Nothing of stage 4b is built or prepared.
## Gates, at `01fd3aedd`
Logs are kept beside the orchestrator's scratch as `r3-*`.
| command | exit |
|---|---|
| `cargo run -- --clippy` | 0, 24 invocations clean |
| `cargo test --test toyos-checks` | 0, 39 passed |
| `cargo test -p toyos-build --lib` | 0 |
| `cargo test --test toyos-build -- --metal --list` | 0, 61
registrations and 232 members over 20 boots |
| `cargo run -- --ci host` | 0, 78 steps green |
| `cargo run -- --build-only` | 0 |
| `cargo test --test toyos-build -- test_rs_endowment_denied` | 1, `No
test matches filter "test_rs_endowment_denied"` |
| `cargo test --test toyos-build -- --metal --metal-readback <dir>
boot:testcases boot:shared-debug` | 2, "staged": three images |
| the same with `endowment_denied 134_double_to_signed`, under `m4` | 2,
"staged": one image |
Host load when the gates started: 18.65 / 29.42 / 32.46.
**No guest runs `endowment_denied`, so the T14 is its only oracle.** The
guest suite's names are `MACHINE_TESTS` and `SCREEN_TESTS`; the
discovered Rust binaries and the C corpus are shared members, run only
by `--metal` and the interactive `--debug`, and the filter above is
refused for that reason. No QEMU boot carries a ROOT with the corpus's
links either: the guest stages C cases as `test_c_<case>` and no
comparator. The rest of the change is reached only through `--metal` and
`toyos-checks`; `guest / suite` is a required check and runs at the
landing head.
## High-risk checks
The harness's batching decides what the kernel's deadline is armed with
and which program's exit a verdict is read from; `endowment_denied` is a
security claim about endowments.
- **Negative controls**: round 2's three mutations of
`tests/common/metal.rs`, each red (101) in
`metal_rows_run_before_members_under_a_bound_the_members_widen` at
`tests/checks/metal.rs` 479, 480 and 499 (the round-2 comment);
`metal.rs` has not changed since. For `endowment_denied`: the T14's
reading of `2c7e1be1a`, the walk before the change on a ROOT with the
corpus's links, red; and `m4`, staged, owed a machine.
- **Independent oracle**: the T14, owed at this head. The supervisor's
`declared` and the build's `unnamed_program` are the rule the narrowed
walk follows, read, not run.
## The host check, and what it sees that reading cannot
`rows_run_before_members_under_a_bound_the_members_widen` is changed,
not added: the last job's place in a list rows and members share, a
bound summed over members of two allowances, and the refusal of two jobs
under one recorded name. No guest test is added or cut;
`endowment_denied`'s walk is narrowed, its claim kept. No dependency is
added. No program is changed.
## Size
`git diff --shortstat origin/main...01fd3ae`: 9 files, +266 −151.
`issues/`: 4 files, +97 −25, one new. `tests/checks/`: +29 −18. The
harness and the record: +128 −106 as before. `endowment_denied.rs`: +12
−2.
## Unsure of
- Whether the 266 that passed at `2c7e1be1a` pass again: one reading of
a boot of its kind.
- The order `read_dir` lists `/system/bin` in. On `m4`'s boot the walk
reds on the mutation's link whichever it meets first; that it passes
over the C case's link there holds only if it meets that one first. The
main boot's 137 is what shows the pass-over.
- `endowment_denied`'s roster read takes 256 entries and asserts its own
pid among them without first refusing a larger roster by name, as
`kill_ends_every_wait` does. Not this change's, and far from reached (26
processes).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_017cSFvbD35xJ2kGANVdm23C
Stage 3a of step B of the one-boot plan for the T14's metal rows: the harness mechanics that let more rows share a boot. Stage 1 was #785, stage 2 #789. Head
49e12f23b, based onmainat5055dc4aa.mainhas moved since and is not merged in: the merge is the queue's, since it moves every image's bytes.49e12f23bdiffers fromd6d008e88by one issue file (git diff d6d008e88 49e12f23b --stat:issues/a-shared-members-allowance-sets-the-kernels-deadline-at-several-times-the-work.md, +42 −15). The gates and the T14 reading below ared6d008e88's. The three images staged at49e12f23bdo not have the sha256 of the three flashed atd6d008e88, so the T14 reading is another head's and three boots are owed at this one: see "The T14".--metal --listbefore (5055dc4aa): 64 registrations and 229 shared members over 25 boots. After: 61 and 232 over 23.shared-2andtestcases-boundsare gone; no test is.What changed, per decision
batches). A row that measures keeps the machine its own jobs gave it, and what the members write to the log lands behind every row's. A shared boot now rides a boot on the terms two arms share one: it is refused, by name, where it disagrees with a row about the config, the parameters or the kernel build.toyos_tco::list_bound_msisJOB_BOUND_MSfor the rows' jobs plus what each member adds.metalimage::derivewrites it as the runner's first argument,--bound-ms=, whichtest-runneralready took; a boot no member rides is told the 60 000 ms the runner took by default, so the image says its bound either way.RUST_MEMBER_MS,C_MEMBER_MS; they were 860 and 260). This is the design's decision 9, which the owner ruled: yes, as recommended. The evidence is the T14 reading atd6d008e88below: 81 ms a member onshared, 15 onccorpusand 32 onshared-debug, so the ruled values stand 3.7, 6.7 and 9.4 times over the mean. The mean is not the member: the slowest Rust member took 2955 ms and the slowest C case 1517 ms, and the bound holds on the list's sum (the issue below). They are numbers a reader checks, and no test holds them.boot-deadline=is twice the list's bound (toyos_tco::wedge_bound_ms). A boot that stages its own wedge keepsSTAGED_BOUND_MS.WEDGE_BOUND_MSis deleted: after the derivation its only readers were its own assertions and tests, which are spelledwedge_bound_ms(JOB_BOUND_MS).HARD_LOCKUP_BOUND_MSstays, tracked as unread inissues/hard-lockup-bound-ms-is-read-by-nothing-but-its-own-assertion.md.toyos-metalwaits for a boot by the deadline its image carries:judge_armsanswers it, and refuses a bound nothing can read as it refuses none, since the kernel panics on one.return_secstook the maximum of five constants.--wait-secsis deleted: nothing passed it.members,members_fitting,chunk_name,sized.selecttakes each shared boot once: whole for its boot word, or only the members a name word is part of, with those members' files and links and no other's.shared-2folds intoshared, and the three bounds programs are its last three members, declared once, onLAST_MEMBERSintests/toyos.rs: behind every discovered member, in the ordertestcases-boundsran them. They are offRUST_SKIP;discover_rust_testsskips both lists. A name taken offLAST_MEMBERSand put nowhere is a discovered member again, so that one edit leaves it on a machine. Not every state does: a name moved fromLAST_MEMBERSontoRUST_SKIPruns nowhere, as any member put there with no driver does, and that is two lines a reader of the diff sees. Theprocess_bound_*rows, thetestcases-boundsarm and both dead labels' rows in the machine's record undertests/metal/are deleted.issues/a-shared-members-allowance-sets-the-kernels-deadline-at-several-times-the-work.md. The allowances are ruled and not derived, the bound grows with every member and has no ceiling, and no reading holds either. It carries both T14 readings with the worst member beside the mean: onsharedfive of 88 members are past 300 ms and make 5616 of the members' 7115 ms, onccorpusone case is 1517 of 2031 ms and read 1141 ms one boot earlier, and a list made only of members as slow as the slowest passes its bound at the 23rd. Its exit: allowances derived from what the T14 measures of a list's total over its members by a stated factor, with the judge redding a list past half its bound; and stage 3b's merged boot reading its list's last record within half its list bound on the T14, the pair read from the kernel's own lines. No ceiling is named.What each boot is armed with
The kernel's deadline counts from its arm, about 60 ms into the kernel; the runner's bound from the kernel's zero. The kernel's hard-lockup bound is half its deadline, so it moves with it.
--metal --listatd6d008e88, andmetal::return_secs's arithmetic for the wait (the deadline in whole seconds, rounded up, and 300 s):--bound-ms=boot-deadline=toyos-metalwaitsshared(88 members)main: 60 000, in two boots)main: 120 000)main: 60 000)main: 420)ccorpus(137)shared-debug(7, and ten rows)deadlinewedge,hardlockup,usbloadThe three images staged at
d6d008e88and again at49e12f23bsay the same: each staging's lines reada list bound of 86400 ms ... a boot deadline of 172800 ms,73700 ... 147400and62100 ... 124200, and--bound-ms=86400,73700and62100are first in the three derived configs' runner arguments.By the same formula the boot stage 3b makes of
shared,ccorpusandtestcases(88 Rust members, 137 C cases) arms a list bound of 100 100 ms and a deadline of 200 200 ms, waited 501 s. At 860 and 260 it was 171 300, 342 600 and 643 s.The T14
At
eff8b20ee, with the allowances at 860 and 260 (the orchestrator's reading; each image's sha256 checked against the request in the command that flashed it). Threetoyos-metalruns, each exit 0. Judged withcargo test --test toyos-build -- --metal --metal-readback <dir> boot:shared boot:ccorpus boot:shared-debug: exit 0, 242 passed, 0 failed, 3 boots (10 registrations and 232 shared members).sharedccorpusshared-debugboot deadline:andhard lockup:lines.the job list ran past its boundin any kernel log, and each loader's pass after the reset readsDONE, notWEDGED: neither bound fired.shared's list ends with the three former bounds programs as members, allexit=0; the tenshared-debugrows PASS.At
d6d008e88, with the allowances at 300 and 100 (the orchestrator's reading; worktree clean before and after, each image's sha256 checked against the request in the command that flashed it). Threetoyos-metalruns, each exit 0. Judged withcargo test --test toyos-build -- --metal --metal-readback <dir> boot:shared boot:ccorpus boot:shared-debug: exit 0, 242 passed, 0 failed, 3 boots (10 registrations and 232 shared members). Each job list is the oneeff8b20eeran (--metal --list's 23 job lists at the two heads compare equal).sharedccorpusshared-debugboot deadline:andhard lockup:lines.the job list ran past its boundin any kernel log; each loader's pass after the reset readsDONE; noWEDGED: neither bound fired. NoFAILin the judge's log.sharedboot holds the machine for 172.8 s whereeff8b20eewould have held it for 271.4 s.At
49e12f23bno machine has been read. The three boots were staged once more to show the images unchanged by an issue file, and they are not:cargo test --test toyos-build -- --metal --metal-readback <dir> boot:shared boot:ccorpus boot:shared-debug, exit 2, which is "staged".d6d008e8849e12f23bsharedc2cb6c860d6c6d96191563b5dd73037e10c80aea83843d0835265f6af3f52c9b46d82e2008ae662c08a5d31db89d3aa159f1337ed00ece16bf3cb12609ef3b77ccorpusae764a8c95a274784a2fb900337f6a25d65d4aa157df647946b1effd523281f2bd2bf4db80ea7311efbf8439c6405b5d3bf498c2d0fbf99d4875ea2f54a4fc89shared-debugf116d8071f9d9708f5ef002ccb3373d7a1b90892df67ce1b062a0d1aacffe4b2ab8d8d6048f50d9932f8d00945cb814f13ef7a4eaddae7332179e79c0e5dbc68What is equal between the two stagings: the three derived configs, byte for byte (
cmp, exit 0 each; their content-named files carry the same names), the job counts and the three armed pairs. What is known to differ: an image carries its commit and that commit's time, which the supervisor prints at boot (build d6d008e88… clean, committed …in the flashed boots' kernel logs), so two heads cannot stage equal bytes whatever the diff between them. Whether that stamp is the whole difference was not measured: the images flashed atd6d008e88were not kept to compare against. Three boots at49e12f23bare staged and requested.The other 20 boots' images differ from
main's by one runner argument,--bound-ms=60000, the value the runner took without it;shared's boot exercises that argument's path. The three staged-wedge boots are waited 360 s for instead of 420.Where the tree differs from the design's text
mainis at 25 (A T14 boot whose log is missing parts reds by name, and the two ACPI rows ride testcases again: 26 boots to 25 #785 tooktestcases-hold), so this stage is 25 to 23.shared-debugin no stage-3a line. Its chunk was a literal 18 with no allowance behind it; the same formula now gives itRUST_MEMBER_MSa member, which moves its deadline from 120 000 to 124 200 ms.Gates, at
d6d008e88cargo test --test toyos-checkscargo test -p toyos-build --libcargo test -p toyos-tcocargo run -- --clippycargo run -- --ci hostcargo run -- --build-onlycargo test --test toyos-build -- --metal --listcargo test --test toyos-build -- virt_reboot virt_smpcargo test --test toyos-build -- --metal --metal-readback <dir> boot:shared boot:ccorpus boot:shared-debugAt
49e12f23b, which adds one issue file's lines and no source:cargo test --lib sourcegatecargo test --test toyos-build -- --metal --metal-readback <dir> boot:shared boot:ccorpus boot:shared-debugNo other gate was run at
49e12f23b.Host load when the host gate started: 46 / 39 / 38.
The guest suite was not run. No guest test reaches a behaviour this changes. The kernel and the runner link
toyos-tco, where two functions were added, one constant neither reads was deleted and two the harness alone reads changed value. No guest boot runs discovered members:discover_rust_testshas two callers,shared_metaland the list of namesregisteredrefuses a duplicate in.metalimage::deriveis reached by no guest test. The threevirt_*tests above boot a kernel built with the changed crate under a runner given--bound-ms=.High-risk checks
The kernel's deadline is the machine's safety net, and this changes what three boots arm it with.
d6d008e88). Twelve red a named host test; one does not build, ontoyos-tco's ownconstassertion; one is refused byregisteredbefore anything boots.eff8b20eeand atd6d008e88; owed again at49e12f23b, whose images are other bytes.The new host test, and what it sees that reading cannot
rows_run_before_members_under_a_bound_the_members_widen(tests/checks/metal.rs) runsbatchesover three rows and two shared boots: the order of one boot's list, the two bounds of four boots, and the two refusals. Order across two loops and a retain, and arithmetic across two crates, are runtime facts.words_take_rows_members_and_whole_bootsis rewritten forselectwithout chunks, and gains the files a member brings. No guest test is added, changed or cut. No dependency is added.Size
git diff --shortstat origin/main...49e12f23b: 14 files, +466 −288.issues/: +112 −11.tests/checks*: +83 −14. Everything else: +271 −263, of which the tests insidesrc/metal.rsandsrc/metalimage.rsare about +30, an estimate.Unsure of
lastnow lands behind a boot's members too. No boot has both today; stage 3b'stestcaseswill, and whether the hold belongs before or after 225 members is that stage's to measure.issues/the-t14-reboots-through-ubuntu-for-every-test.mdpriced a session at 74.8 s of members by the chunk rule this stage deletes. The sentence now states the derivation; its "two sessions" rested on that price and is the track's to recount.🤖 Generated with Claude Code
https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A