diff --git a/doc/ci.md b/doc/ci.md index 434a7f831..4a64cb6f5 100644 --- a/doc/ci.md +++ b/doc/ci.md @@ -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 diff --git a/doc/openvmm-upstream-roadmap.md b/doc/openvmm-upstream-roadmap.md index 852f78bcb..ee3a11ea2 100644 --- a/doc/openvmm-upstream-roadmap.md +++ b/doc/openvmm-upstream-roadmap.md @@ -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 @@ -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 @@ -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, @@ -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). @@ -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 @@ -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 diff --git a/openvmm b/openvmm index b58040ee4..3d7512af6 160000 --- a/openvmm +++ b/openvmm @@ -1 +1 @@ -Subproject commit b58040ee46c6ed2953415b3734b0ee0c2b7485b6 +Subproject commit 3d7512af653717aa9123595e993a56cb8587106a diff --git a/scripts/nvx_tools/ci.py b/scripts/nvx_tools/ci.py index cbcdd1472..df4f66d10 100644 --- a/scripts/nvx_tools/ci.py +++ b/scripts/nvx_tools/ci.py @@ -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, ) @@ -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 @@ -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", diff --git a/scripts/nvx_tools/openvmm_test_shards.json b/scripts/nvx_tools/openvmm_test_shards.json index 45ec87887..5e9a367d9 100644 --- a/scripts/nvx_tools/openvmm_test_shards.json +++ b/scripts/nvx_tools/openvmm_test_shards.json @@ -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, "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, @@ -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", @@ -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" ] diff --git a/scripts/test_nvx_tools.py b/scripts/test_nvx_tools.py index ddace8b12..f5e99d554 100644 --- a/scripts/test_nvx_tools.py +++ b/scripts/test_nvx_tools.py @@ -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) @@ -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( @@ -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") @@ -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 @@ -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()