Fall back from --cpu-profile auto to a host profile, with a warning, on CPUs that no built-in profile serves
I maintainer di solito rispondono entro 1 giorno
@ppenna ci sta già lavorando.
Dal 8/10/2026.
Valutazione
Questa issue non è ancora stata valutata.
Descrizione
Summary
A cold boot with --cpu-profile auto, the default, fails with E_PROFILE_HOST_UNKNOWN on every CPU that no built-in profile serves, such as Cascade Lake, Sapphire Rapids, Granite Rapids, Tiger Lake, Meteor Lake, and AMD's Ryzen CPUs. --cpu-profile host (#394) boots such Intel and AMD hosts, but only after the user opts in following the failure; otherwise each CPU waits for a pinned profile (#408, #409). This includes the Granite Rapids runners of Copilot cloud agent sessions, where test-microvm always uses auto.
Firecracker needs no per-model catalog to boot: by default it presents what KVM supports, normalized per vendor and never per model, and it leaves a uniform fleet to CPU templates that operators derive themselves. NVX's closest equivalent is the host profile, which derives from this host under the built-in profiles' derivation policy and is verified as a built-in profile is.
This issue tracks making auto fall back to a host profile on those CPUs. The fallback is not silent: every cold boot that uses it warns, and the warning invites the user to open an issue with the CPU's fingerprint, so that the CPU gets a built-in profile. This reverses the rule that "auto never falls back to a host profile" (#394), a spec decision that #390 called out. Host qualification is unchanged.
Behavior
A cold boot with --cpu-profile auto:
| Host CPU | Today | Proposed |
|---|---|---|
| Served by a built-in profile | That profile | Unchanged |
| Intel or AMD, no built-in profile | E_PROFILE_HOST_UNKNOWN, naming --cpu-profile host |
intel.host.v1 or amd.host.v1, with the warning below |
| Another vendor, such as Hygon | E_PROFILE_HOST_UNKNOWN |
Unchanged |
| In more than one built-in generation | E_PROFILE_HOST_UNKNOWN |
Unchanged: a catalog defect |
Explicit profile IDs, --cpu-profile host, restores, which take the snapshot's profile, and --cpu-fingerprint are unchanged. doctor H2 still fails with E_PROFILE_HOST_UNKNOWN and H3 still rejects a host profile, so CI and benchmark hosts keep needing a built-in profile.
A fallback has the limits of --cpu-profile host:
- It isn't pinned: a microcode, firmware, hypervisor, or OS update can change it.
- Each cold boot fingerprints the backend first: 5.5 ms on WHP, 11 to 23 ms on KVM, and 52 ms on MSHV, as measured in #394.
- Its snapshots restore only on a host with the same CPU model and stepping whose hypervisor supports the profile.
- If the host profile can't boot, for example because the hypervisor lacks a CPU feature that the time ABI requires (
E_PROFILE_UNSUPPORTED), the error must say thatautofell back to it.
The warning
OpenVMM already warns that a --cpu-profile host profile isn't pinned. The fallback applies wherever auto is selected, the management endpoint included, so OpenVMM, not run, logs one warning per cold boot that falls back, at the default log level, with a stable marker that run, tests, and log scrapers can match. It names the host CPU (vendor, display family/model/stepping, and brand string), the host profile and its digest, and the limits above, and invites the user to contribute. For example:
WARN no built-in CPU profile serves this host's CPU, GenuineIntel 6/173/1 (Intel(R) Xeon(R) 6973P-C):
--cpu-profile auto fell back to intel.host.v1 (sha256 ...), a profile derived from this host for
development. It is not pinned, and its snapshots restore only on hosts of the same CPU model and
stepping. Help NVX add a built-in profile for this CPU: run
openvmm --hypervisor kvm --cpu-fingerprint fingerprint.json
and attach fingerprint.json to a CPU profile request:
https://github.com/microsoft/nvx/issues/new?template=cpu-profile.yml
The fingerprint holds the CPU's identity and microcode, the OS kind and build, the hypervisor's interface, and the CPUID, XSAVE, MSR, and time surface that the backend supports. It holds no hostname, user name, or serial number.
CPU profile requests
Add an issue form, .github/ISSUE_TEMPLATE/cpu-profile.yml, which the warning and run link to, prefilling the CPU from the URL's query where the form allows. It asks for:
- the CPU's name and its display family, model, and stepping;
- the backend (KVM, MSHV, or WHP), the OS build, and whether the host is bare metal or a VM, with its cloud SKU;
- the attached fingerprint, and fingerprints from the generation's other backends where available, because a profile is the intersection of its backends' fingerprints and released profiles are immutable;
- optionally, whether
test-microvmpasses on the fallback.
Maintainers link each request to #408 or #409, which explain how a fingerprint becomes a pinned profile.
Plan
- In nanvix/openvmm:
- Fall back in
select_on_host(openvmm/openvmm_core/src/worker/dispatch/time_abi.rs), whereautonow appends the--cpu-profile hosthint: whencpu_profile::selectfails withE_PROFILE_HOST_UNKNOWNandcpu_profile::supports_host_profilesserves the host, derive the host profile as--cpu-profile hostdoes, check its generation, and warn. - Add a test hook that makes
autotreat the host as unknown, so that CI's runners, which built-in profiles serve, exercise the fallback. - Update
cpu_profile_selection,auto_names_host_profiles_only_where_they_serve, andauto_names_host_profiles_where_the_backend_lacks_the_profilein the same file, and add tests for the fallback and its warning, a Hygon host that still fails, a fallback that cannot boot, and the restore of a fallback's snapshot. - Update the Guide:
--cpu-profileinGuide/src/reference/openvmm/management/cli.md, andGuide/src/user_guide/openvmm/snapshots.md.
- Fall back in
- In NVX, promote that OpenVMM revision, then:
- Add the issue form.
-
run: replacehost_cpu_unsupported_guidanceinscripts/nvx_tools/time_abi.py, which says thatautofails on such CPUs, and its tests inscripts/test_time_abi.pyandscripts/test_nvx_tools.py. -
benchmark: refuse a fallback, or record it and keep its results out of performance history, because its cold boots include a fingerprint. - Confirm that
doctorH2 and H3 still fail on such a host, so that CI's microVM jobs still require a built-in profile. - Update
doc/design/time-abi.md(the "No implicit fallbacks" goal, Selection, Host profiles, the failure codes, and the Guide appendix),doc/usage.md(--cpu-profile, theE_PROFILE_HOST_UNKNOWNparagraph ofrun, and CPU profiles), and.github/copilot-instructions.md, which says that every microVM cold boot fails on a Granite Rapids runner.
- Run
test-microvmwith the defaultautoon a host that no built-in profile serves, such as a GitHub-hosted Granite Rapids runner on KVM, and on WHP and MSHV hosts where available.
Open decisions
- Should
autoalso fall back when the backend doesn't support the CPU's built-in profile (E_PROFILE_UNSUPPORTED)? Proposed: no. That reveals a profile or hypervisor problem on a supported generation, and OpenVMM already names--cpu-profile hostthere. - Should a strict selection, such as
--cpu-profile pinned, keep today's failure for scripts that need a built-in profile?doctoralready rejects host profiles, so CI doesn't need one. - Should the warning of an explicit
--cpu-profile hostcarry the invitation too?
- Lingua principale
- Python
- Stelle
- 408
- Fork
- 28
- Merge medio
- 16h 35m
- PR unite (30g)
- 348
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di microsoft/nvx
-
Track nvx-rs host VMM supervisor bugs: a non-UTF-8 process name at a reused PID blocks reconcile, reattach, and stopForse già presa @56steve l’ha presa 3 giorni fa. Apertabug-hunt confirmed good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
microsoft/nvx#720 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
I maintainer di solito rispondono entro 1 giorno
-
nvx-rs: give a layered root's workloads the DNS server that their network policy allowsForse già presa @esaurez l’ha presa oggi. Aperta
microsoft/nvx#860 · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 24/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 54/100
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di microsoft/nvx
Issue simili
-
Project submission:Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
slavakurilyak/awesome-ai-agents#845 ·
I maintainer di solito rispondono entro 1 giorno
-
tests: pin that the atomic writers in utils/paths.py stage the temporary file in the target's directoryForse già presa Una pull request collegata a questa issue è aperta o già unita. Apertadifficulty:2 enhancement good first issue
Difficoltà 1/5 1-3 ore Idoneità per principianti 92/100
MakazhanAlpamys/Soup#2178 ·
I maintainer di solito rispondono entro 1 giorno
-
[BUG] dcg.waggr permutation p-values are folded twice, so near-zero scores get the smallest p-valuesAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
scverse/rapids-singlecell#854 ·
I maintainer di solito rispondono entro 1 giorno
-
Slang input: int8_t4_packed and uint8_t4_packed are copied into CrossGLForse già presa @ninglinLiu l’ha presa 1 giorno fa. Apertaarea:frontend backend:slang bug direction:input
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
I maintainer di solito rispondono entro 1 giorno
-
random_elements(unique=True) on an OrderedDict: ZeroDivisionError once only zero weights remain, AssertionError with use_weighting=FalseForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
I maintainer di solito rispondono entro 13 giorni