Skip to content

Repin OpenVMM to microVM v2.2 - #600

Open
Pedro Henrique Penna (ppenna) wants to merge 2 commits into
devfrom
agents/microvm-v22-promoto-pin-nvx-repo
Open

Pedro Henrique Penna (ppenna) wants to merge 2 commits into
devfrom
agents/microvm-v22-promoto-pin-nvx-repo

Conversation

@ppenna

@ppenna Pedro Henrique Penna (ppenna) commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Repin OpenVMM to microVM v2.2

This PR pins the openvmm submodule to d0bdbed8f6e3b86271277dc22658109e2e633b2d, the head of the new nanvix/openvmm microvm/v2.2 branch. A second commit stops the Linux VMM-test runs from selecting the nested tests that the new pin brings in (see CI).

  • Previous pin: 5ab8a8462, nanvix/openvmm main. microvm/v2.1 was fast-forwarded from 2130f24b5 to this commit (12 commits), so it now records the complete v2.1 line.
  • New pin: d0bdbed8f, which is 5ab8a8462's 320-commit microVM stack rebased onto microsoft/openvmm main at 790132851 (75 upstream commits after v2.1's base e1cdbd916). The branch has 312 linear commits, and every one carries a good signature.
  • OpenVMM review PR: none. microvm/v2.2 was pushed directly, and nanvix/openvmm upstream/main was not changed.
  • Head submitted to CI: 3c0bbc15e5320329da654617e15d93795d914346, two commits on dev e67a06f40.

Equivalence

git range-diff e1cdbd916..5ab8a8462 790132851..d0bdbed8f reports 262 unchanged commits, 50 changed commits, and 8 dropped commits. No commit was added or reordered. Of the changed commits, 23 differ only in context lines. The tree differs from the previous pin by the upstream changes and the resolutions and adaptations below, so this is a behavioral promotion, not a tree-identical one.

Dropped commits:

Resolved conflicts:

Adaptations, each folded into the commit that introduced the affected code so that intermediate commits build:

Wire compatibility

Every vmservice.proto field that the previous pin defines keeps its number, and no message reuses a tag. Upstream adds SerialBackend.file, VirtioBlk.serial, VirtioVsock.guest_cid, and SnpIsolationConfig, and it reshapes IsolationConfig from an enum to a oneof. NVX does not use IsolationConfig.

Validation

Bare metal

At this head, three bare-metal hosts with Intel Xeon Silver 4114 (Skylake-SP) CPUs ran CI's test steps from isolated checkouts: Linux/KVM (Ubuntu, kernel 7.0), Linux/MSHV (Azure Linux 3.0, kernel 6.6), and Windows Server 2025/WHP. The microVM steps were generated from run-nvx-microvm-tests.yml with CI's shells and inputs. Each host also ran the debug-kernel restore scenarios, which CI runs for MSHV and WHP only on pushes to dev. The guest images are CI's exact-head guest-artifacts and guest-debug-kernel. The MSHV and WHP hosts built OpenVMM from the pin. The KVM host's microVM tests used CI's exact-pin openvmm-linux-gnu build, whose SHA-256 matches its provenance, and its test-openvmm compiled from source.

Check Linux/KVM Linux/MSHV Windows/WHP
doctor H1 to H4: CPU profile intel.skylake-sp.v1 and time ABI preflight pass pass pass
test-microvm, every scenario 41 pass 41 pass 41 pass
test-microvm --debug-kernel 8 pass 8 pass 8 pass
Managed sandbox acceptance, Ubuntu smoke, and Azure Linux smoke pass pass pass
Ubuntu extended (KVM only) pass n/a n/a
Ubuntu sandbox layer and share tests 6 pass 6 pass 5 pass
aci_edge_sandboxes lifecycle pass pass pass
test-openvmm 58 of 58 57 of 57 29 of 29
test-openvmm-unit not run; CI runs it on MSHV and WHP 5294 of 5294 tests, 391 doc-test binaries 4933 of 4933 tests, 391 doc-test binaries
  • The Linux validate-nvx steps pass on the KVM host: 1181 tests.
  • Every warp probe stayed within the time ABI's 1 µs cross-vCPU bound. KVM and MSHV saw no backward TSC step. WHP saw backward steps of up to 23 ns. An A/B on the same WHP host shows that this predates the pin: three alternating runs each of smp, smp-snapshot, and restore-processors gave maximum backward steps of 17, 17, and 21 ns at the previous pin and 21, 23, and 10 ns at this pin, with maximum offsets of 66 to 68 ns for both.
  • No OpenVMM process outlived a test.

Build and unit checks

These checks ran on a Windows x86-64 workstation and in WSL2 Ubuntu with Rust 1.95.0.

Check Linux Windows
cargo check --workspace --all-targets --locked, every commit 304 of 312 pass 304 of 312 pass
cargo clippy --workspace --all-targets --locked -- -D warnings, head pass pass
test-openvmm-unit suite, head 5294 of 5294 tests, 391 doc-test binaries 4932 of 4933 tests, 391 doc-test binaries
  • The eight failing commits, from virt: build the time ABI effective CPUID in one place to virt_mshv, virt_whp: name test host fixtures by CPU, don't build the virt_support_x86emu tests on either platform. Their v2.1 counterparts have the same gap: virt starts depending on serde_json there, and the stack's own virt_support_x86emu: make the tests' vector and VTL comparisons explicit fixes it right after them. Those test lines are unchanged since e1cdbd916.
  • On Windows, the eight commits from virt_whp: use the shared Hyper-V feature table warn about unused constants in virt_whp/src/profile_features.rs. That file and its users match v2.1 at those commits. No other commit warns on either platform.
  • cargo metadata --locked passes at every commit, and cargo xtask fmt passes at the head.
  • The Windows unit failure was an openvmm_helpers snapshot-publishing test. In each of two full runs under heavy load, one such test, a different one each time, failed because renaming a freshly written staging directory in %TEMP% returned ERROR_ACCESS_DENIED. openvmm_helpers passed 10 of 10 runs alone, both at this pin and at the previous pin, and its code differs from the previous pin only by calling upstream's byte-identical pal functions. One net_consomme loopback test failed once with WSAEACCES under the same load and passes alone. On the bare-metal WHP host, all 4933 tests pass.
  • NVX verify and the Windows validate-nvx steps pass at the pin commit. One host-loopback script test exceeded its 10-second budget while the per-commit builds ran, and it passes alone.

CI

On the pin commit alone, run 39103565708 passed every job except the KVM and MSHV OpenVMM vmm-tests jobs, with the WHP VMM and microVM jobs still running when the fix was pushed. microsoft/openvmm#4578 adds nested VMM tests whose names contain openvmm, which the Linux filter selects. Nine of them need an aarch64-unknown-linux-musl test archive, which the runners can't build, so flowey failed while it defined the pipeline. The tenth needs nested virtualization.

Exclude OpenVMM's nested VMM tests from the Linux runs adds !test(vm_host) to both Linux filters, because every nested test name contains its L1 host's vm_host* test function. Listing the vmm_tests binary at the pin on Linux shows the fix removes exactly those 10 tests and nothing else (KVM: 68 to 58, MSHV: 67 to 57). ruff, pyright for both platforms, and test_nvx_tools pass.

At this head, run 39130146896 passed every job: the OpenVMM builds, unit tests, and VMM tests on all three backends, the NVX microVM tests (including the KVM debug kernel), the KVM, MSHV, and WHP platform benchmarks, and the performance regression gate.

Pin the openvmm submodule to d0bdbed8f, the head of the new
nanvix/openvmm microvm/v2.2 branch. That branch rebases the 320-commit
microVM stack of nanvix/openvmm main (5ab8a8462, the previous pin, to
which microvm/v2.1 now points) onto microsoft/openvmm main at
790132851. It drops eight commits that upstream already contains or
supersedes and folds the adaptations to upstream API changes into the
commits that needed them.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 18, 2026 06:18

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

The behavioral hypervisor rebase needs human review and completed KVM, MSHV, and WHP runtime and benchmark validation.

No open issues 🎉

What changed in this PR

Promotes NVX’s OpenVMM dependency to microVM v2.2, incorporating an upstream rebase and compatibility adaptations.

Changes:

  • Updates only the openvmm gitlink from 5ab8a8462 to d0bdbed8f.
  • Introduces behavioral changes affecting time control, interrupts, networking, and device configuration.
File Description

Review effort: Balanced

microsoft/openvmm#4578, which the microVM v2.2 pin brings in, adds nested
VMM tests whose names contain "openvmm", so the KVM and MSHV filters
select them. Nine run an aarch64 L1 host that needs an
aarch64-unknown-linux-musl test archive, which the Linux runners cannot
build, so flowey fails while it defines the pipeline. The remaining one
needs nested virtualization.

Every nested test name contains its L1 host's test function, vm_host or
a variant, and no other test name does. Exclude those names on both
Linux backends.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 18, 2026 13:07

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

The reviewed filter and regression-test changes have no identified blocking defects.

1 open issue

Review effort: Balanced

Comment thread scripts/nvx_tools/ci.py
# A nested test runs inside an L1 VM host whose test function, vm_host or a
# variant, appears in its name. The Linux runners support neither nested
# virtualization nor the aarch64-unknown-linux-musl archive of aarch64 hosts.
OPENVMM_NESTED_TEST_EXCLUSION = " & !test(vm_host)"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants