Repository navigation
openvmm: serve virtio-fs requests after a gated restore - #918
Merged
Pedro Henrique Penna (ppenna) merged 3 commits intoOct 27, 2026
Merged
Pedro Henrique Penna (ppenna) merged 3 commits into
Pedro Henrique Penna (ppenna) merged 3 commits into
Conversation
Pin microsoft/openvmm#4762 at e68871cc6f14fceb6d38a899504ae8105f89e310, two commits on a12d9167f, the previous pin, which is the head of feature/microvm/dev. A tiered restore starts the VM's devices behind the post-restore input gate, which closes request admission on the microVM virtio-fs device. Its queue workers ended as soon as they found admission closed, and nothing started them again when the guest acknowledged the restore and input resumed, so every FUSE request of the clone, from its FUSE_INIT on, waited forever. A share attached at the restore, such as a clone's export bound to the dormant filesystem slot, could be mounted but never used. The first commit factors the virtio-fs integration test harness. The second makes each worker wait for admission to reopen instead of ending, and a stop still cancels the wait at once. That also fixes the rollback of a failed save, which starts the queues again behind the gate, and a worker that completes a request behind a snapshot boundary, which ended the same way. The snapshot guide and the virtio-fs reference now say that the guest's virtio-fs requests wait until the gate's release, so post-restore repair must not wait for their replies. Part of #904 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Record the two commits that the previous commit pins as positions 344 and 345 of the microVM chain, and move the NVX pin to e68871cc6. Position 344 factors the virtio-fs integration test harness, and position 345 makes a microVM virtio-fs queue worker wait for request admission to reopen instead of ending. They fix the request admission that position 111, in PR18, added: its worker ended for good when it found admission closed, as it does in the queues that a gated restore, or the rollback of a failed save, starts. Both are therefore PR18 fixups, to fold into position 111, rather than new work. Add them to PR18's row of the PR summary and to its commit mapping, the chain, and the table of the commits after the mapped tip, and extend the scope. The pin is now 188 commits past the mapped tip. Positions 341 to 343 are no longer only a proposal: microsoft/openvmm#4749 merged them, so position 343, a12d9167f, is the head of feature/microvm/dev. Say so in the scope, and name microsoft/openvmm#4762 as the proposal of positions 344 and 345. Part of #904 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
No test used a virtio-fs share after a tiered restore. The filesystem-snapshot scenario restores untiered snapshots, which arm no post-restore input gate, so it passed while every microVM virtio-fs queue that a gated restore started ended at once and left the clone's FUSE requests waiting forever. Add the platform-filesystem microVM scenario to the default suite. The scenario captures a platform snapshot without --mount, which leaves the filesystem slot dormant, and restores it with a --mount of a host directory, as a clone's export binds the slot. After the guest's platform repair acknowledges the restore and the gate releases, the clone's post-restore script mounts the share, reads the file that the host wrote, and writes one that the host then reads. The guest reports a failed check with NVX-PLATFORM-FILESYSTEM-FAIL, which fails the restore at once, and the restore may not change the snapshot. The platform capture needs sandbox blocks, so the scenario runs only with the Alpine sandbox-control guest, like platform-zero-fill. On a local Windows/WHP host, with an OpenVMM built from the pinned revision, it passed in 4.0 s; with the previous pin, a12d9167f, the clone acknowledged the restore and then hung on its first read until the 40 s phase timeout. The shards are planned again with an estimate of 6 s, which CI's duration reports replace once CI has run it. Unit tests cover the guest script, the capture and restore commands, the required markers, the guest's result on the host, a failure that the guest reports, and the snapshot's integrity. doc/ci.md describes the scenario, and doc/usage.md lists it among the scenarios that need the sandbox-control guest. Part of #904 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
There was a problem hiding this comment.
🔵 Needs a closer look
The OpenVMM pin changes snapshot-sensitive queue concurrency and needs human review with confirmed KVM and MSHV validation.
No open issues 🎉
What changed in this PR
This PR updates NVX’s OpenVMM pin to address #904, where virtio-fs queue workers stopped during gated restores and left filesystem requests hanging. It adds regression coverage for attaching and using a share after a platform snapshot restore.
Changes:
- Pins the OpenVMM fix that waits for request admission to reopen instead of ending queue workers.
- Adds the
platform-filesystemscenario and unit tests covering file exchange, failure reporting, and snapshot integrity. - Updates CI shard assignments, scenario documentation, and the upstream roadmap.
| File | Description |
|---|---|
scripts/test_microvm_tests.py |
Tests scenario commands, markers, file results, failures, and snapshot integrity. |
scripts/nvx_tools/microvm_tests.py |
Registers and implements the platform filesystem restore scenario. |
scripts/nvx_tools/microvm_test_scripts/platform-filesystem.sh |
Mounts the restored share and checks guest read/write operations. |
scripts/nvx_tools/microvm_shards.json |
Adds the scenario and rebalances platform shards. |
doc/usage.md |
Documents the scenario’s Alpine sandbox-control requirement. |
doc/openvmm-upstream-roadmap.md |
Records the new pin and maps its two commits to PR18 fixups. |
doc/ci.md |
Describes the regression scenario and its expected behavior. |
Review effort: Balanced
Pedro Henrique Penna (ppenna)
deleted the
agents/issue-904-logical-commits-pr-guidelines
branch
October 27, 2026 15:46
Enrique Saurez (esaurez)
pushed a commit
that referenced
this pull request
Oct 28, 2026
This branch exists only to run CI. It is never a pull request's head, and this commit never goes onto a pull request's branch. It is #958's head, 4a614d9, which holds #955, #956, and #958, with the fixes that dev carries for the failures that their review bases, pinned to OpenVMM 79a501b6, show in CI, and that the pull requests do not change: - #885's test-only 3fbaf8a, cherry-picked before this commit. On GitHub's hosted Windows runners an open with backup semantics bypasses the test's access list. - This commit, which moves the openvmm gitlink 79a501b6 -> e68871cc, the virtio-fs fix of #904 that dev pins since #918, so that a clone's export serves requests after a gated restore. The platform tier's allowlist there admits maxcpus=, so the copy of it in nvx-rs/tests/vectors/openvmm, which the CLI jobs compare with the submodule, takes that line too. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 34e6ffe3-3ebf-42db-bfca-e0ecfade6873
Enrique Saurez (esaurez)
pushed a commit
that referenced
this pull request
Oct 28, 2026
This branch exists only to run CI. It is never a pull request's head, and this commit never goes onto a pull request's branch. It is #958's head, 4a614d9, which holds #955, #956, and #958, with the fixes that dev carries for the failures that their review bases, pinned to OpenVMM 79a501b6, show in CI, and that the pull requests do not change: - #885's test-only 3fbaf8a, cherry-picked before this commit. On GitHub's hosted Windows runners an open with backup semantics bypasses the test's access list. - This commit, which moves the openvmm gitlink 79a501b6 -> e68871cc, the virtio-fs fix of #904 that dev pins since #918, so that a clone's export serves requests after a gated restore. The platform tier's allowlist there admits maxcpus=, so the copy of it in nvx-rs/tests/vectors/openvmm, which the CLI jobs compare with the submodule, takes that line too. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 34e6ffe3-3ebf-42db-bfca-e0ecfade6873
Enrique Saurez (esaurez)
pushed a commit
that referenced
this pull request
Oct 28, 2026
This branch exists only to run CI. It is never a pull request's head, and this commit never goes onto a pull request's branch. It is #958's head, 4a614d9, which holds #955, #956, and #958, with the fixes that dev carries for the failures that their review bases, pinned to OpenVMM 79a501b6, show in CI, and that the pull requests do not change: - #885's test-only 3fbaf8a, cherry-picked before this commit. On GitHub's hosted Windows runners an open with backup semantics bypasses the test's access list. - This commit, which moves the openvmm gitlink 79a501b6 -> e68871cc, the virtio-fs fix of #904 that dev pins since #918, so that a clone's export serves requests after a gated restore. The platform tier's allowlist there admits maxcpus=, so the copy of it in nvx-rs/tests/vectors/openvmm, which the CLI jobs compare with the submodule, takes that line too. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 34e6ffe3-3ebf-42db-bfca-e0ecfade6873
Enrique Saurez (esaurez)
pushed a commit
that referenced
this pull request
Oct 28, 2026
This branch exists only to run CI. It is never a pull request's head, and this commit never goes onto a pull request's branch. It is #958's head, 4a614d9, which holds #955, #956, and #958, with the fixes that dev carries for the failures that their review bases, pinned to OpenVMM 79a501b6, show in CI, and that the pull requests do not change: - #885's test-only 3fbaf8a, cherry-picked before this commit. On GitHub's hosted Windows runners an open with backup semantics bypasses the test's access list. - This commit, which moves the openvmm gitlink 79a501b6 -> e68871cc, the virtio-fs fix of #904 that dev pins since #918, so that a clone's export serves requests after a gated restore. The platform tier's allowlist there admits maxcpus=, so the copy of it in nvx-rs/tests/vectors/openvmm, which the CLI jobs compare with the submodule, takes that line too. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 34e6ffe3-3ebf-42db-bfca-e0ecfade6873
Pedro Henrique Penna (ppenna)
added a commit
that referenced
this pull request
Oct 30, 2026
The nvx-openvmm-promote skill described a promotion as one commit that changes only the openvmm gitlink, and required exactly one commit on the target. Each of the twelve promotions from #801 to #1042 instead followed its gitlink commit with a doc: commit that maps the pinned commits in doc/openvmm-upstream-roadmap.md, as 6d3442d followed 70adf89 in #1042. Nothing said which of the roadmap's sections a promotion updates; #918, for one, left PR18's node in the dependency graph at 11 commits while the PR summary gave 13. A new section of the skill makes the roadmap commit part of the procedure. It takes the previous pin from the target's gitlink, and stops unless the pinned revision descends from it with no merge since the fork base. It tells an OpenVMM pull request that branched from an older head of feature/microvm/dev, which needs a rebase but leaves the roadmap valid, from a rebase of the whole chain, which shifts every position and needs the roadmap remapped. It derives the pin's position, its distance from the mapped tip, and the new positions from Git rather than by counting, and lists what a promotion updates: the Scope's pin and chain of OpenVMM pull requests, whose previous proposal has usually merged since; the branch DAG, whose final step grows only when it is unassigned; and the table of the commits after the mapped tip, whose remarks it backs with commands that find the earlier commits that change the same files. A fixup of mapped work also updates its PR's row, graph node, and commit mapping. The section ends by checking that the branch holds exactly the two commits and that the second changes only the roadmap. The pull-request section rebuilds both commits when the target moves, and the report covers both. Vectors: since the skill described the openvmm_vectors comparison, the test has come to check three excerpts of OpenVMM's sources and four versions of nvx::contract against the submodule too, while the skill still had a failure copy "both files". It now gives each kind of failure its fix, and runs the check-nvx-rs checks, whose runtime adapter compiles the excerpts. Landing: .gitmodules tracks feature/microvm/dev, and microsoft/openvmm allows only squash merges, which would land a commit other than the one that NVX pins. OpenVMM pull requests land by fast-forwarding that branch to the pinned revision, as microsoft/openvmm#4818 and microsoft/openvmm#4820 did. The skill now says so, pushes only when the user asks, and has the NVX pull request state that landing order. doc/contribute.md and .github/copilot-instructions.md described a one-commit, gitlink-only promotion too; they now describe both commits. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pedro Henrique Penna (ppenna)
added a commit
that referenced
this pull request
Oct 30, 2026
The nvx-openvmm-promote skill described a promotion as one commit that changes only the openvmm gitlink, and required exactly one commit on the target. Each of the twelve promotions from #801 to #1042 instead followed its gitlink commit with a doc: commit that maps the pinned commits in doc/openvmm-upstream-roadmap.md, as 6d3442d followed 70adf89 in #1042. Nothing said which of the roadmap's sections a promotion updates; #918, for one, left PR18's node in the dependency graph at 11 commits while the PR summary gave 13. A new section of the skill makes the roadmap commit part of the procedure. It takes the previous pin from the target's gitlink, and stops unless the pinned revision descends from it with no merge since the fork base. It tells an OpenVMM pull request that branched from an older head of feature/microvm/dev, which needs a rebase but leaves the roadmap valid, from a rebase of the whole chain, which shifts every position and needs the roadmap remapped. It derives the pin's position, its distance from the mapped tip, and the new positions from Git rather than by counting, and lists what a promotion updates: the Scope's pin and chain of OpenVMM pull requests, whose previous proposal has usually merged since; the branch DAG, whose final step grows only when it is unassigned; and the table of the commits after the mapped tip, whose remarks it backs with commands that find the earlier commits that change the same files and, separately, check with git merge-tree whether the new commits apply to upstream main as they are. A fixup of mapped work also updates its PR's row, graph node, and commit mapping. The section ends by checking that the branch holds exactly the two commits and that the second changes only the roadmap. The pull-request section rebuilds both commits when the target moves, and the report covers both. Vectors: since the skill described the openvmm_vectors comparison, the test has come to check three excerpts of OpenVMM's sources and four versions of nvx::contract against the submodule too, while the skill still had a failure copy "both files". It now gives each kind of failure its fix, and runs the check-nvx-rs checks, whose runtime adapter compiles the excerpts. Landing: .gitmodules tracks feature/microvm/dev, and microsoft/openvmm allows only squash merges, which would land a commit other than the one that NVX pins. OpenVMM pull requests land by fast-forwarding that branch to the pinned revision, as microsoft/openvmm#4818 and microsoft/openvmm#4820 did. The skill now says so, pushes only when the user asks, and has the NVX pull request state that landing order. doc/contribute.md and .github/copilot-instructions.md described a one-commit, gitlink-only promotion too; they now describe both commits. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pedro Henrique Penna (ppenna)
added a commit
that referenced
this pull request
Oct 30, 2026
The nvx-openvmm-promote skill described a promotion as one commit that changes only the openvmm gitlink, and required exactly one commit on the target. Each of the twelve promotions from #801 to #1042 instead followed its gitlink commit with a doc: commit that maps the pinned commits in doc/openvmm-upstream-roadmap.md, as 6d3442d followed 70adf89 in #1042. Nothing said which of the roadmap's sections a promotion updates; #918, for one, left PR18's node in the dependency graph at 11 commits while the PR summary gave 13. A new section of the skill makes the roadmap commit part of the procedure. It takes the previous pin from the target's gitlink, and stops unless the pinned revision descends from it with no merge since the fork base. It tells an OpenVMM pull request that branched from an older head of feature/microvm/dev, which needs a rebase but leaves the roadmap valid, from a rebase of the whole chain, which shifts every position and needs the roadmap remapped. It derives the pin's position, its distance from the mapped tip, and the new positions from Git rather than by counting, after unshallowing a submodule that the Copilot setup's --depth 1 left shallow, whose boundary would cut the counts short without an error. It lists what a promotion updates: the Scope's pin and chain of OpenVMM pull requests, whose previous proposal has usually merged since; the branch DAG, whose final step grows only when it is unassigned; and the table of the commits after the mapped tip, whose remarks it backs with commands that find the earlier commits that change the same files and, separately, check with git merge-tree whether the new commits apply to upstream main. Only a type-check of their packages on that merged tree lets the remarks say that they can go upstream on their own. A fixup of mapped work also updates its PR's row, graph node, and commit mapping. The section ends by checking that the branch holds exactly the two commits and that the second changes only the roadmap. The pull-request section rebuilds both commits when the target moves, and the report covers both. Vectors: since the skill described the openvmm_vectors comparison, the test has come to check three excerpts of OpenVMM's sources and four versions of nvx::contract against the submodule too, while the skill still had a failure copy "both files". It now gives each kind of failure its fix, and runs the check-nvx-rs checks, whose runtime adapter compiles the excerpts. Landing: .gitmodules tracks feature/microvm/dev, and microsoft/openvmm allows only squash merges, which would land a commit other than the one that NVX pins. OpenVMM pull requests land by fast-forwarding that branch to the pinned revision, as microsoft/openvmm#4818 and microsoft/openvmm#4820 did. The skill now says so, pushes only when the user asks, and has the NVX pull request state that landing order. doc/contribute.md and .github/copilot-instructions.md described a one-commit, gitlink-only promotion too; they now describe both commits. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pedro Henrique Penna (ppenna)
added a commit
that referenced
this pull request
Oct 30, 2026
The nvx-openvmm-promote skill described a promotion as one commit that changes only the openvmm gitlink, and required exactly one commit on the target. Each of the twelve promotions from #801 to #1042 instead followed its gitlink commit with a doc: commit that maps the pinned commits in doc/openvmm-upstream-roadmap.md, as 6d3442d followed 70adf89 in #1042. Nothing said which of the roadmap's sections a promotion updates; #918, for one, left PR18's node in the dependency graph at 11 commits while the PR summary gave 13. A new section of the skill makes the roadmap commit part of the procedure. It takes the previous pin from the target's gitlink, and stops unless the pinned revision descends from it with no merge since the fork base. It tells an OpenVMM pull request that branched from an older head of feature/microvm/dev, which needs a rebase but leaves the roadmap valid, from a rebase of the whole chain, which shifts every position and needs the roadmap remapped. It derives the pin's position, its distance from the mapped tip, and the new positions from Git rather than by counting, after unshallowing a submodule that the Copilot setup's --depth 1 left shallow, whose boundary would cut the counts short without an error. It lists what a promotion updates: the Scope's pin and chain of OpenVMM pull requests, whose previous proposal has usually merged since; the branch DAG, whose final step grows only when it is unassigned; and the table of the commits after the mapped tip, whose remarks it backs with commands that find the earlier commits that change the same files and, separately, check with git merge-tree whether the new commits apply to upstream main. Only a type-check of their packages on that merged tree lets the remarks say that they can go upstream on their own. A fixup of mapped work also updates its PR's row, graph node, and commit mapping. The section ends by checking that the branch holds exactly the two commits and that the second changes only the roadmap. The pull-request section rebuilds both commits when the target moves, and the report covers both. Vectors: since the skill described the openvmm_vectors comparison, the test has come to check three excerpts of OpenVMM's sources and four versions of nvx::contract against the submodule too, while the skill still had a failure copy "both files". It now gives each kind of failure its fix, and runs the check-nvx-rs checks, whose runtime adapter compiles the excerpts. Landing: .gitmodules tracks feature/microvm/dev, and microsoft/openvmm allows only squash merges, which would land a commit other than the one that NVX pins. OpenVMM pull requests land by fast-forwarding that branch to the pinned revision, as microsoft/openvmm#4818 and microsoft/openvmm#4820 did. The skill now says so, pushes only when the user asks, and has the NVX pull request state that landing order. doc/contribute.md and .github/copilot-instructions.md described a one-commit, gitlink-only promotion too; they now describe both commits. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pedro Henrique Penna (ppenna)
added a commit
that referenced
this pull request
Oct 30, 2026
The nvx-openvmm-promote skill described a promotion as one commit that changes only the openvmm gitlink, and required exactly one commit on the target. Each of the twelve promotions from #801 to #1042 instead followed its gitlink commit with a doc: commit that maps the pinned commits in doc/openvmm-upstream-roadmap.md, as 6d3442d followed 70adf89 in #1042. Nothing said which of the roadmap's sections a promotion updates; #918, for one, left PR18's node in the dependency graph at 11 commits while the PR summary gave 13. A new section of the skill makes the roadmap commit part of the procedure. It takes the previous pin from the target's gitlink, and stops unless the pinned revision descends from it with no merge since the fork base. It tells an OpenVMM pull request that branched from an older head of feature/microvm/dev, which needs a rebase but leaves the roadmap valid, from a rebase of the whole chain, which shifts every position and needs the roadmap remapped. It derives the pin's position, its distance from the mapped tip, and the new positions from Git rather than by counting, after unshallowing a submodule that the Copilot setup's --depth 1 left shallow, whose boundary would cut the counts short without an error. It lists what a promotion updates: the Scope's pin and chain of OpenVMM pull requests, whose previous proposal has usually merged since; the branch DAG, whose final step grows only when it is unassigned; and the table of the commits after the mapped tip, whose remarks it backs with commands that find the earlier commits that change the same files and, separately, check with git merge-tree whether the new commits apply to upstream main. Only a type-check of their packages on that merged tree lets the remarks say that they can go upstream on their own. A fixup of mapped work also updates its PR's row, graph node, and commit mapping. The section ends by checking that the branch holds exactly the two commits and that the second changes only the roadmap. The pull-request section rebuilds both commits when the target moves, and the report covers both. Vectors: since the skill described the openvmm_vectors comparison, the test has come to check three excerpts of OpenVMM's sources and four versions of nvx::contract against the submodule too, while the skill still had a failure copy "both files". It now gives each kind of failure its fix, reruns the comparison until it passes, since each test stops at its first mismatch and only the NVX CLI jobs run these ignored tests, and runs the check-nvx-rs checks, whose runtime adapter compiles the excerpts. Landing: .gitmodules tracks feature/microvm/dev, and microsoft/openvmm allows only squash merges, which would land a commit other than the one that NVX pins. OpenVMM pull requests land by fast-forwarding that branch to the pinned revision, as microsoft/openvmm#4818 and microsoft/openvmm#4820 did. The skill now says so, pushes only when the user asks, and has the NVX pull request state that landing order. doc/contribute.md and .github/copilot-instructions.md described a one-commit, gitlink-only promotion too; they now describe both commits. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #904. Pins microsoft/openvmm#4762 at
e68871cc6f14fceb6d38a899504ae8105f89e310, whose microVM virtio-fs queue workers wait for request admission to reopen instead of ending, so a share that a clone uses after a tiered restore, such as an export bound to the dormant filesystem slot, answers its requests instead of hanging them. It adds a microVM scenario that covers that case on KVM, MSHV, and WHP.Based on
devat7d4df3571. microsoft/openvmm#4762 is two commits directly ona12d9167f, the head offeature/microvm/devand the revision thatdevpins, so this branch's three commits are its whole diff.Change
88cc8943eopenvmmopenvmma12d9167f→e68871cc6: the two commits of microsoft/openvmm#4762b4c0204aadocdoc/openvmm-upstream-roadmap.mdfeature/microvm/dev864a5f020scriptsscripts/nvx_tools/microvm_tests.py,scripts/nvx_tools/microvm_test_scripts/platform-filesystem.sh,scripts/test_microvm_tests.py,scripts/nvx_tools/microvm_shards.json,doc/ci.md,doc/usage.mdplatform-filesystem; shards replannedOpenVMM changes
task_controlrecorded it as done, and nothing started it again when the guest acknowledged the restore andrelease_snapshot_boundaryreopened admission. Every FUSE request of the clone, from its FUSE_INIT on, then waited forever; the mount still succeeded because it does not wait for FUSE_INIT. The rollback of a failed save, which starts the queues again behind the gate, ended the same way.a04cc8a00). Factors the virtio-fs integration test harness without changing what its tests do, so that a test can drive the microVM device, restart a queue from saved state, and await a reply later.e68871cc6). A worker now waits for admission to reopen, through anevent_listener::Eventthatresume()notifies, in a wait that a stop cancels at once and that leaves nothing registered when it is dropped. Admission still precedesqueue.next(), so a closed gate leaves descriptors on the virtqueue and a save still finds no request in flight. The snapshot guide and the virtio-fs reference now say that a tiered restore gates filesystem input too, so post-restore repair must not wait for a virtio-fs reply. Unit and integration tests cover it; without the fix, both integration tests time out.Tests
platform-filesystemcaptures a platform snapshot without--mount, which leaves the filesystem slot dormant, and restores it with a--mountof a host directory, as a clone's export binds the slot. After the platform repair acknowledges the restore and the gate releases, the clone mounts the share, reads the file that the host wrote, and writes one that the host then reads; the restore may not change the snapshot. A failed guest check printsNVX-PLATFORM-FILESYSTEM-FAIL, which fails the restore at once. It runs with the Alpine sandbox-control guest only, likeplatform-zero-fill, and joins shard 2 on KVM and shard 1 on MSHV and WHP with a 6 s estimate.Evidence
On a local Windows/WHP host, with OpenVMM built from
e68871cc6and the guest artifacts of the development releasev0.1.0-dev.ef7c177c66d1:e68871cc6(this pin)a12d9167f(previous pin)platform-filesystemNVX-POST-RESTORE-OK: tier=platform, then hangs on its first read until the 40 s phase timeout, which reproduces #904filesystem-snapshot,filesystem-shares,filesystem-policy,filesystem-comma-paths,denied-filesystem-paths,scratch-snapshot,platform-zero-fill,snapshot-tiersKVM and MSHV are left to CI.
Equivalence and validation
a12d9167f, the previous pin and the head offeature/microvm/dev, as their parent. The OpenVMM protocol vectors and built-in CPU profiles thatnvx-rscopies are unchanged:openvmm_vectorsandopenvmm_cpu_profilespass with--ignored.virtiofs:cargo clippy --all-targets -- -D warnings,cargo doc --no-deps,cargo nextest run(112 passed), the new tests under--stress-count 30(30/30), andcargo xtask fmt --fix(clean).nvx.py verify,ruff check,ruff format --check,pyrightfor Linux and Windows, the Markdown link check,compileall,test_adversarial.py,test_hosts.py, and thevalidate-nvxunittest list (1,286 tests), whose only failures are the unrelated ones below.test_setup_azure.pyand, intermittently,test_host_loopback_allow_script_checks_publication_and_traffic, which run Linux shell scripts under Git'ssh.exehere;test_setup_azure.pyfails the same way without this branch's script changes. CI runs them on its runners.shellcheckandshfmt(no checked shell script changed), the Specula wiring tests, and the OpenVMM VMM tests. CI runs them.Exact NVX head submitted to CI:
864a5f020cc40da7fba33d7503e39e9dc46ed529.