Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions doc/ci.md
Original file line number Diff line number Diff line change
Expand Up @@ -1547,10 +1547,10 @@ seconds from its tests' durations, and
[`plan-openvmm-test-shards`](usage.md#plan-openvmm-test-shards) balances the
shards' modeled times. Two shards of equal sums of durations would take 177
and 175 seconds, because each would hold a heavy test that stalls its other
tests. The plan instead puts both heavy tests with shorter tests in one shard,
which takes 119.8 seconds, and the two FreeBSD tests, the longest at 87.9 and
83.9 seconds, with the PCIe tests in the other, which takes 123.9. A test
checks the model's test threads and the path of the JUnit report that
tests. The first plan instead put both heavy tests with shorter tests in one
shard, which took 119.8 seconds, and the two FreeBSD tests, the longest at
87.9 and 83.9 seconds, with the PCIe tests in the other, which took 123.9. A
test checks the model's test threads and the path of the JUnit report that
`test-openvmm` reads against OpenVMM's pinned nextest configuration.

A shard job spends a median 35 seconds beside its tests in the runs since
Expand Down
39 changes: 24 additions & 15 deletions doc/openvmm-upstream-roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,15 @@
- Mapped fork tip: `a0556d7d85ce1fff89f5b45a98f15c5c79cbb6fb`, position 157. The graph, PR
summary, and commit mapping below cover positions 001-157 and the fixups at positions
334-340, 344, and 345.
- NVX's pinned OpenVMM revision: `b58040ee46c6ed2953415b3734b0ee0c2b7485b6`, position 370.
Position 370, which microsoft/openvmm#4823 proposes for `feature/microvm/dev`, is one commit on
position 369, `5e0ab772e`, the head of `feature/microvm/dev` since microsoft/openvmm#4820
merged positions 368 and 369. Those are two commits on position 367, `bcfc47cff`, which
microsoft/openvmm#4818 merged with position 366. Positions 366 and 367 are two commits on
position 365, `e4c741e18`, which microsoft/openvmm#4804 merged with positions 362-364.
Positions 362-365 are four commits on position 361, `c32c57d12`, which microsoft/openvmm#4807
merged with position 360.
- NVX's pinned OpenVMM revision: `3d7512af653717aa9123595e993a56cb8587106a`, position 372.
Positions 371 and 372, which microsoft/openvmm#4816 proposes for `feature/microvm/dev`, are two
commits on position 370, `b58040ee4`, the head of `feature/microvm/dev` since
microsoft/openvmm#4823 merged it. Position 370 is one commit on position 369, `5e0ab772e`, which
microsoft/openvmm#4820 merged with position 368. Positions 368 and 369 are two commits on
position 367, `bcfc47cff`, which microsoft/openvmm#4818 merged with position 366. Positions 366
and 367 are two commits on position 365, `e4c741e18`, which microsoft/openvmm#4804 merged with
positions 362-364. Positions 362-365 are four commits on position 361, `c32c57d12`, which
microsoft/openvmm#4807 merged with position 360.
Positions 360 and 361 are two commits on position 359, `bd2b27a2e`, which microsoft/openvmm#4794
merged with positions 355-358. Positions 355-359 are five commits on position 354, `832d5bb48`,
which microsoft/openvmm#4775 merged with position 353. Positions 353 and 354 are two commits on
Expand All @@ -30,9 +31,9 @@
microsoft/openvmm#4735 merged with position 339. Positions 339 and 340 are two commits on
position 338, `8a0d945ed`, which microsoft/openvmm#4734 merged, and position 338 is one commit on
`79a501b63`, the head of the `feature/microvm/release/v2.3` branch of microsoft/openvmm. The pin
is 213 commits past the mapped tip on the same first-parent chain. Positions 158-333, 341-343,
and 346-370 are not yet assigned to PRs; see
[Commits after the mapped tip](#commits-after-the-mapped-tip).
is 215 commits past the mapped tip on the same first-parent chain. Positions 158-333, 341-343,
and 346-370 are not yet assigned to PRs, and positions 371 and 372 port microsoft/openvmm#4803;
see [Commits after the mapped tip](#commits-after-the-mapped-tip).
- Upstream main: `22c0485be597f87a76771e1db03eaa823a685ffc` (2026-10-22), the fork base.

## Upstream status
Expand Down Expand Up @@ -323,7 +324,8 @@ The physical branch is one first-parent chain:
-> PR02 fixup [338] -> PR20 fixup [339] -> PR23 fixup [340]
-> unassigned [341-343] -> PR18 fixups [344-345]
-> unassigned [346-370]
-> b58040ee4 (NVX pin)
-> microsoft/openvmm#4803 port [371-372]
-> 3d7512af6 (NVX pin)
```

For upstream review, PR01-PR08 and PR14 can be rebased independently onto current upstream main,
Expand All @@ -345,11 +347,11 @@ PR18's position 111.

## Commits after the mapped tip

The NVX pin extends the chain past position 157 without merges. Of the 213 later commits,
The NVX pin extends the chain past position 157 without merges. Of the 215 later commits,
positions 158-333, 341-343, and 346-370 are not yet classified or assigned to PRs, positions
334-337 are the fixups of the `feature/microvm/release/v2.3` rebase, position 338 is a PR02
fixup, positions 339 and 340 are PR20 and PR23 fixups, and positions 344 and 345 are PR18
fixups.
fixup, positions 339 and 340 are PR20 and PR23 fixups, positions 344 and 345 are PR18 fixups,
and positions 371 and 372 port microsoft/openvmm#4803.
This table groups them by topic in chain order; ranges are inclusive, as in the
[PR summary](#pr-summary).

Expand Down Expand Up @@ -404,6 +406,7 @@ This table groups them by topic in chain order; ranges are inclusive, as in the
| 366-367 | `e51ab72d3..bcfc47cff` | 2 | The restore's comparison of the effective CPUID with a snapshot's record names every difference of a record that the decoder admits although no OpenVMM writes it, each entry that the record lists more than once, each of its listings that differs, and a record out of order, together with the entries that differ; and its tests check each register, value, and mask that the error names (microsoft/openvmm#4818) |
| 368-369 | `342887c99..5e0ab772e` | 2 | The VM time keeper maps a timeout beyond what the host clock can represent to the host clock's latest time: one more than about 584 years after the last start no longer panics the task that arms it, as one armed across a restore to a far VM time panicked the keeper's task at start (microsoft/nvx#1038), and one nearly half the ring after now, which VM time's circular order puts before the start, no longer arms the host timer in the past, which made the keeper spin (microsoft/openvmm#4820) |
| 370 | `b58040ee4` | 1 | Explicit `--host-loopback allow` requires an IPv4 network of /29 or larger: OpenVMM refuses it on a /30, which leaves no address at which Consomme presents host peers, at a cold boot and at a restore that installs a new policy on a NIC template, instead of presenting IPv4 host peers at the gateway (microsoft/openvmm#4823) |
| 371-372 | `2dec9edcb..3d7512af6` | 2 | The KVP IC VMM test boots Windows Server 2025 instead of 2022, whose COM activation race can lose WMI's server-registration notification, so that the guest answers the test's IP information request with `0x80080005` after 120 seconds (microsoft/nvx#1035); and the check-in gates' x64 Linux KVM job downloads the Server 2025 image and keeps running the test, while the x64 Linux MSHV job excludes it because Server 2025's required initial reset fails there (microsoft/openvmm#4816, which ports microsoft/openvmm#4803) |

Some of these commits change mapped work rather than add to it. Positions 246-250 remove the
legacy microVM clock paths and change files that PR10 and PR17 also change. Position 252 makes
Expand Down Expand Up @@ -431,6 +434,12 @@ and the fork base have alike. Positions 043 and 301 change other parts of that f
370 changes only how the microVM options bind their network policy to the NIC's identity, to
which position 307 adds explicit host-loopback access and position 347 the restore that installs
a new policy, and the CLI and Consomme references, so it builds on those fork-only commits.
Position 371 makes the change of microsoft/openvmm#4803 unchanged. Position 372 stages the
Server 2025 image for the x64 Linux KVM job, which runs the test, and excludes the test and its
image from the x64 Linux MSHV job, where Server 2025's required initial reset fails. A rebase
onto an upstream main that includes microsoft/openvmm#4803 drops position 371, as the rebases
dropped the commits under [Landed upstream](#landed-upstream), and reconciles position 372 with
whatever upstream changes for those jobs.

## PR summary

Expand Down
6 changes: 3 additions & 3 deletions scripts/nvx_tools/ci.py
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,7 @@ def _exclude_openvmm_tests(
f"({OPENVMM_LINUX_TEST_FILTER})"
f"{OPENVMM_NESTED_TEST_EXCLUSION}"
" & !test(no_vmbus_prepped_boot_no_vmbus_windows)"
" & !test(windows_datacenter_core_2022_x64)"
" & !test(windows_datacenter_core)"
" & !test(virtio_net_windows)",
OPENVMM_KVM_EXCLUDED_TESTS,
)
Expand All @@ -706,7 +706,7 @@ def _exclude_openvmm_tests(
)
OPENVMM_MSHV_TEST_FILTER = _exclude_openvmm_tests(
f"({OPENVMM_LINUX_TEST_FILTER}){OPENVMM_NESTED_TEST_EXCLUSION}"
" & !test(windows_datacenter_core_2022_x64)",
" & !test(windows_datacenter_core)",
OPENVMM_MSHV_EXCLUDED_TESTS,
)
# ttrpc::test_ttrpc_interface stays on the Linux backends: it boots Linux
Expand All @@ -716,8 +716,8 @@ def _exclude_openvmm_tests(
# checks for Hyper-V on Windows.
OPENVMM_WHP_TESTS = (
"multiarch::hibernate::openvmm_uefi_x64_guest_test_x64_hibernate_halts",
"multiarch::ic::openvmm_uefi_x64_windows_datacenter_core_2022_x64_kvp_ic",
"multiarch::ic::openvmm_uefi_x64_windows_datacenter_core_2022_x64_timesync_ic",
"multiarch::ic::openvmm_uefi_x64_windows_datacenter_core_2025_x64_kvp_ic",
"multiarch::openvmm_pcat_x64_freebsd_13_2_x64_boot_no_agent",
"multiarch::openvmm_pcat_x64_freebsd_13_2_x64_iso_boot_no_agent",
"multiarch::openvmm_pcat_x64_windows_datacenter_core_2022_x64_boot",
Expand Down
14 changes: 7 additions & 7 deletions scripts/nvx_tools/openvmm_test_shards.json
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,8 @@
"test_threads": 8,
"seconds": {
"multiarch::hibernate::openvmm_uefi_x64_guest_test_x64_hibernate_halts": 3.9,
"multiarch::ic::openvmm_uefi_x64_windows_datacenter_core_2022_x64_kvp_ic": 34.0,
"multiarch::ic::openvmm_uefi_x64_windows_datacenter_core_2022_x64_timesync_ic": 32.3,
"multiarch::ic::openvmm_uefi_x64_windows_datacenter_core_2025_x64_kvp_ic": 57.4,
Comment thread
ppenna marked this conversation as resolved.
Resolved
"multiarch::openvmm_pcat_x64_freebsd_13_2_x64_boot_no_agent": 87.9,
"multiarch::openvmm_pcat_x64_freebsd_13_2_x64_iso_boot_no_agent": 83.9,
"multiarch::openvmm_pcat_x64_windows_datacenter_core_2022_x64_boot": 29.5,
Expand Down Expand Up @@ -163,16 +163,16 @@
},
"shards": [
{
"seconds": 119.8,
"seconds": 128.4,
"tests": [
"multiarch::hibernate::openvmm_uefi_x64_guest_test_x64_hibernate_halts",
"multiarch::ic::openvmm_uefi_x64_windows_datacenter_core_2022_x64_kvp_ic",
"multiarch::ic::openvmm_uefi_x64_windows_datacenter_core_2022_x64_timesync_ic",
"multiarch::openvmm_pcat_x64_windows_datacenter_core_2022_x64_boot",
"multiarch::openvmm_pcat_x64_windows_datacenter_core_2022_x64_boot_heavy",
"multiarch::openvmm_uefi_x64_windows_datacenter_core_2022_x64_boot_heavy",
"multiarch::openvmm_uefi_x64_windows_datacenter_core_2022_x64_boot_nvme",
"multiarch::openvmm_uefi_x64_windows_datacenter_core_2022_x64_secure_boot_mismatched_template",
"multiarch::pcie::openvmm_uefi_x64_windows_datacenter_core_2022_x64_pcie_root_emulation_single_segment",
"multiarch::pcie::openvmm_uefi_x64_windows_datacenter_core_2022_x64_pcie_switches",
"multiarch::vmgs::openvmm_uefi_x64_ubuntu_2504_server_x64_invalid_boot_entries",
"multiarch::vmgs::openvmm_uefi_x64_windows_datacenter_core_2022_x64_clear_vmgs",
"multiarch::vmgs::openvmm_uefi_x64_windows_datacenter_core_2022_x64_default_boot",
Expand All @@ -183,20 +183,20 @@
]
},
{
"seconds": 123.9,
"seconds": 128.3,
"tests": [
"multiarch::ic::openvmm_uefi_x64_windows_datacenter_core_2025_x64_kvp_ic",
"multiarch::openvmm_pcat_x64_freebsd_13_2_x64_boot_no_agent",
"multiarch::openvmm_pcat_x64_freebsd_13_2_x64_iso_boot_no_agent",
"multiarch::openvmm_uefi_x64_frontpage",
"multiarch::openvmm_uefi_x64_guest_test_x64_guest_test_uefi",
"multiarch::openvmm_uefi_x64_ubuntu_2504_server_x64_secure_boot_mismatched_template",
"multiarch::openvmm_uefi_x64_windows_datacenter_core_2022_x64_boot",
"multiarch::openvmm_uefi_x64_windows_datacenter_core_2022_x64_boot_nvme",
"multiarch::openvmm_uefi_x64_windows_datacenter_core_2022_x64_secure_boot",
"multiarch::pcie::openvmm_uefi_x64_windows_datacenter_core_2022_x64_pcie_hotplug",
"multiarch::pcie::openvmm_uefi_x64_windows_datacenter_core_2022_x64_pcie_nvme_boot",
"multiarch::pcie::openvmm_uefi_x64_windows_datacenter_core_2022_x64_pcie_root_emulation_multi_segment",
"multiarch::pcie::openvmm_uefi_x64_windows_datacenter_core_2022_x64_pcie_root_emulation_single_segment",
"multiarch::pcie::openvmm_uefi_x64_windows_datacenter_core_2022_x64_pcie_switches",
"ttrpc::test_ttrpc_uefi_boot",
"x86_64::openvmm_uefi_x64_windows_datacenter_core_2022_x64_battery_capacity"
]
Expand Down
39 changes: 34 additions & 5 deletions scripts/test_nvx_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -3079,7 +3079,7 @@ def test_openvmm_tests_define_each_backend_filter(self):
ci.OPENVMM_KVM_TEST_FILTER,
)
self.assertIn(
"!test(windows_datacenter_core_2022_x64)",
"!test(windows_datacenter_core)",
ci.OPENVMM_KVM_TEST_FILTER,
)
self.assertIn("!test(virtio_net_windows)", ci.OPENVMM_KVM_TEST_FILTER)
Expand Down Expand Up @@ -3112,7 +3112,7 @@ def test_openvmm_tests_define_each_backend_filter(self):
ci.OPENVMM_MSHV_TEST_FILTER,
)
self.assertIn(
"!test(windows_datacenter_core_2022_x64)",
"!test(windows_datacenter_core)",
ci.OPENVMM_MSHV_TEST_FILTER,
)
self.assertEqual(
Expand Down Expand Up @@ -3209,6 +3209,29 @@ def test_openvmm_tests_define_each_backend_filter(self):
),
)

def test_linux_filters_leave_out_every_windows_server_test(self):
# The Linux legs run Linux guests. A test's name holds the year of its
# Windows Server image, so a test that moves to another image, as the
# KVP IC test moved from 2022 to 2025 (#1035), must stay out of them.
windows_tests = [
test for test in ci.OPENVMM_WHP_TESTS if "windows_datacenter_core" in test
]
self.assertIn(
"multiarch::ic::openvmm_uefi_x64_windows_datacenter_core_2025_x64_kvp_ic",
windows_tests,
)
for backend in ("kvm", "mshv"):
test_filter = ci.OPENVMM_TEST_FILTERS[backend]
for test in windows_tests:
with self.subTest(backend=backend, test=test):
self.assertFalse(_nextest_filter_matches(test_filter, test))
for test in (
"multiarch::ic::openvmm_uefi_x64_ubuntu_2504_server_x64_timesync_ic",
*ci.OPENVMM_REQUIRED_MICROVM_TESTS,
):
with self.subTest(backend=backend, test=test):
self.assertTrue(_nextest_filter_matches(test_filter, test))

def test_openvmm_tests_reject_unknown_backend(self):
with self.assertRaisesRegex(common.ScriptError, "unsupported.*backend"):
ci.run_openvmm_tests("unknown")
Expand Down Expand Up @@ -4733,8 +4756,11 @@ def edit(manifest: dict[str, object], change: str, content: Path) -> None:

def _nextest_filter_matches(expression: str, test: str) -> bool:
"""Return whether a nextest filter that OpenVMM's test filters spell,
with test(/REGEX/), !, &, |, and parentheses, selects a test's name."""
tokens = re.findall(r"test\(/(?:[^/\\]|\\.)*/\)|[!&|()]", expression)
with test(/REGEX/), test(SUBSTRING), !, &, |, and parentheses, selects a
test's name."""
tokens = re.findall(
r"test\(/(?:[^/\\]|\\.)*/\)|test\([^/)][^)]*\)|[!&|()]", expression
)
if "".join(tokens) != "".join(expression.split()):
raise AssertionError(f"unsupported filter {expression!r}")
position = 0
Expand All @@ -4756,7 +4782,10 @@ def primary() -> bool:
if take() != ")":
raise AssertionError(f"unbalanced filter {expression!r}")
return value
return re.search(token[6:-2], test) is not None
if token.startswith("test(/"):
return re.search(token[6:-2], test) is not None
# Without slashes, test() matches a substring of the name.
return token[5:-1] in test

def intersection() -> bool:
value = primary()
Expand Down
Loading