From: Fiona Ebner <f.ebner@proxmox.com>
To: Arthur Bied-Charreton <a.bied-charreton@proxmox.com>,
pve-devel@lists.proxmox.com
Subject: Re: [PATCH qemu-server v4 04/17] cpu flags: add helper querying CPU flags with nodes supporting them
Date: Thu, 7 May 2026 13:57:03 +0200 [thread overview]
Message-ID: <ee16a91e-11d4-4974-beeb-794cf3ed2b82@proxmox.com> (raw)
In-Reply-To: <20260430160109.565536-5-a.bied-charreton@proxmox.com>
Am 30.04.26 um 5:59 PM schrieb Arthur Bied-Charreton:
> The get_supported_cpu_flags helper returns a hardcoded list of
> VM-specific flags, without any information on which nodes actually
> support them.
>
> Add query_available_cpu_flags, which annotates the flags QEMU recognizes
> as `-cpu` arguments with the nodes that actually support them to give an
> accurate picture of which flags will be accepted when starting a VM. Flags
> can be filtered by scope (vm-specific or all) and queried for the
> specific acceleration type (kvm/tcg), which determines which nodes report
> supporting which flag.
>
> This currently returns early when $arch is set to `aarch64`. This is
> intended for vm-specific flags, since there are none that are currently
> meant to be settable for VMs. For the general flags list, this is a
> limitation due to the fact that it is a lot harder to get a list of
> understood flags at QEMU build time for `aarch64`, as opposed to
> `86_64`, where `-cpu help` will just list all of them. It is left for a
Typo: should be x86_64
> future TODO.
>
> Signed-off-by: Arthur Bied-Charreton <a.bied-charreton@proxmox.com>
> ---
> src/PVE/QemuServer/CPUFlags.pm | 104 +++++++++++++++++++++++++++++++++
> 1 file changed, 104 insertions(+)
>
> diff --git a/src/PVE/QemuServer/CPUFlags.pm b/src/PVE/QemuServer/CPUFlags.pm
> index 51d7753e..0bf560b4 100644
> --- a/src/PVE/QemuServer/CPUFlags.pm
> +++ b/src/PVE/QemuServer/CPUFlags.pm
> @@ -14,6 +14,7 @@ our @EXPORT_OK = qw(
> supported_cpu_flags_names
> get_supported_cpu_flags
> query_understood_cpu_flags
> + query_available_cpu_flags
> );
>
> my $supported_vm_specific_cpu_flags_by_arch = {
> @@ -98,6 +99,10 @@ sub supported_cpu_flags_names() {
> return sort keys $all_supported_vm_specific_cpu_flags->%*;
> }
>
> +sub supported_cpu_flags_names_by_arch($arch) {
> + return sort map { $_->{name} } $supported_vm_specific_cpu_flags_by_arch->{$arch}->@*;
Again, perlcritic complains here about the "return sort"
> +}
> +
> sub cpu_flag_supported_re() {
> return qr/([+-])(@{[join('|', supported_cpu_flags_names())]})/;
> }
> @@ -123,4 +128,103 @@ sub query_understood_cpu_flags($arch) {
>
> return \@flags;
> }
> +
> +# Return true if `$flag` may be set for a single VM.
Nit: s/for a single VM/for a VM's CPU flags configuration/
> +sub flag_is_vm_specific($flag) {
> + return defined($all_supported_vm_specific_cpu_flags->{$flag});
> +}
> +
> +# Flag is represented by the `nested-virt` alias
> +sub flag_is_aliased($flag) {
If we add such a helper, it should rather return the actual alias as a
result already.
> + return $flag eq 'vmx' || $flag eq 'svm';
> +}
> +
> +sub description_by_flag($arch) {
Maybe just flag_descriptions? The current name kinda makes it sound like
I should be passing a flag along.
> + return { map { $_->{name} => $_->{description} }
> + $supported_vm_specific_cpu_flags_by_arch->{$arch}->@* };
> +}
> +
> +# Retrieve a list of available flags, i.e., flags that will be accepted as `-cpu` arguments by QEMU
> +# when attempting to spawn a VM. Each flag is returned along with a list of nodes that support it.
> +# Flags that are not supported on any node are also returned, filtering them out is up to the consumer
> +# of this API.
> +#
> +# The $accel parameter (`kvm`|`tcg`) selects which acceleration type flag <> node compatibility should
> +# be evaluated.
> +#
> +# The $vm_specific boolean parameter allows filtering by flag scope. When set to 1, return only
> +# vm-specific flags, otherwise return all flags.
> +#
> +# The $arch parameter (`x86_64`|`aarch64`) specifies which architecture to query flags for. Note that
> +# in both scopes (`vm-specific`,`all`), `aarch64` returns empty lists: this is wanted for `vm-specific`,
> +# as no `aarch64` flags are currently intended to be settable for a specific VM, however this is a
> +# known limitation for `all`. PVE does not currently ship a list of understood flags for `aarch64`,
> +# it is not as trivial to get as for `x86_64`, whose flags are easy to parse out of QEMU's `-cpu help`
> +# output.
> +#
> +# In order to get an accurate picture of which flags can actually be used, we combine two sources (see
> +# PVE::QemuServer::query_supported_cpu_flags for details):
> +#
> +# 1. The understood CPU flags, i.e., all flags QEMU accepts as `-cpu` arguments in principle, regardless
> +# whether the host CPU actually supports them.
> +# 2. The supported CPU flags: the flags the host CPU actually supports, cached in the node KV store by
> +# `pvestatd`. This is node-specific.
> +#
> +# Each flag from 1. is annotated with the subset of nodes from 2. that report supporting it.
Style nit: some lines are too long
Nit: if not too much effort, it would be nice to use POD for such
documentation like we started doing elsewhere
> +sub query_available_cpu_flags($accel, $vm_specific, $arch) {
> + # TODO: Find out a way to get supported flags for aarch64. This is not done because PVE
> + # does not currently ship a list of understood flags for aarch64, as it's more difficult
> + # to obtain during QEMU build - for x86_64, qemu -cpu help will just list the flags.
> + return [] if $arch eq 'aarch64';
> +
> + my $descriptions = description_by_flag($arch);
> + my $base =
> + !$vm_specific
> + ? query_understood_cpu_flags($arch)
> + : [supported_cpu_flags_names_by_arch($arch)];
> + my $available_flags = {
> + map {
> + $_ => { name => $_, 'supported-on' => {}, description => $descriptions->{$_} }
> + } @$base
> + };
> +
> + my $kv_store = $accel eq 'kvm' ? 'cpuflags-kvm' : 'cpuflags-tcg';
Nit: could be "cpuflags-$accel"
> + my $flags = PVE::Cluster::get_node_kv($kv_store);
> +
> + $available_flags->{'nested-virt'} = {
> + name => 'nested-virt',
> + 'supported-on' => {},
> + description => $descriptions->{'nested-virt'},
> + };
> +
> + my $add_flag = sub($node, $name) {
> + return if !defined($available_flags->{$name});
> + $available_flags->{$name}->{'supported-on'}->{$node} = 1;
> + };
> +
> + for my $node (keys %$flags) {
> + # This depends on `pvestatd` storing the flags in space-separated format, which is the case
> + # at the time of this commit.
> + for (split(' ', $flags->{$node})) {
> + my $aliased = flag_is_aliased($_);
> + next if $vm_specific && !flag_is_vm_specific($_) && !$aliased;
> + $add_flag->($node, $_) if !($vm_specific && $aliased);
> + $add_flag->($node, 'nested-virt') if $aliased;
> + }
> + }
> +
> + for my $flag (values %$available_flags) {
> + $flag->{'supported-on'} = [sort keys %{ $flag->{'supported-on'} }];
Style nit: prefer using ->%* in such cases for dereference
> + }
> +
> + # Make sure 'nested-virt' is always shown first.
> + my $nested_virt = delete $available_flags->{'nested-virt'};
> + my @sorted = sort {
> + (scalar(@{ $a->{'supported-on'} }) == 0) <=> (scalar(@{ $b->{'supported-on'} }) == 0)
Style nit: prefer using ->@* in such cases for dereference
There could be a comment that we are ordering flags that are not
supported anywhere to the end, to avoid people needing to interpret the
code each time.
> + || $a->{name} cmp $b->{name}
> + } values %$available_flags;
> +
> + return [defined($nested_virt) ? ($nested_virt, @sorted) : @sorted];
> +}
> +
> 1;
next prev parent reply other threads:[~2026-05-07 11:57 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-30 16:00 [PATCH docs/manager/qemu-server v4 00/17] Add API and UI for custom CPU models Arthur Bied-Charreton
2026-04-30 16:00 ` [PATCH pve-docs v4 01/17] qm: add anchor to "CPU Type" section Arthur Bied-Charreton
2026-05-07 10:34 ` Fiona Ebner
2026-04-30 16:00 ` [PATCH qemu-server v4 02/17] cpu config: rename CPU models config path variable Arthur Bied-Charreton
2026-05-07 10:57 ` Fiona Ebner
2026-04-30 16:00 ` [PATCH qemu-server v4 03/17] cpu flags: move cpu flags-related utilities to their own module Arthur Bied-Charreton
2026-05-07 11:15 ` Fiona Ebner
2026-04-30 16:00 ` [PATCH qemu-server v4 04/17] cpu flags: add helper querying CPU flags with nodes supporting them Arthur Bied-Charreton
2026-05-07 11:57 ` Fiona Ebner [this message]
2026-04-30 16:00 ` [PATCH qemu-server v4 05/17] cpu config: add helpers to lock and write config Arthur Bied-Charreton
2026-05-07 12:06 ` Fiona Ebner
2026-04-30 16:00 ` [PATCH qemu-server v4 06/17] cpu: register standard option for CPU format Arthur Bied-Charreton
2026-05-07 12:11 ` Fiona Ebner
2026-05-07 14:01 ` Arthur Bied-Charreton
2026-05-07 14:08 ` Fiona Ebner
2026-05-08 6:40 ` Arthur Bied-Charreton
2026-04-30 16:00 ` [PATCH qemu-server v4 07/17] cpu config: set 'type' field before writing Arthur Bied-Charreton
2026-05-07 12:24 ` Fiona Ebner
2026-05-08 7:48 ` Arthur Bied-Charreton
2026-04-30 16:01 ` [PATCH qemu-server v4 08/17] cpu flags: improve flags list returned by endpoint Arthur Bied-Charreton
2026-05-07 13:10 ` Fiona Ebner
2026-04-30 16:01 ` [PATCH pve-manager v4 09/17] api: add endpoint querying available CPU flags cluster-wide Arthur Bied-Charreton
2026-05-07 13:29 ` Fiona Ebner
2026-04-30 16:01 ` [PATCH pve-manager v4 10/17] api: add CRUD handlers for custom CPU models Arthur Bied-Charreton
2026-05-07 14:02 ` Fiona Ebner
2026-04-30 16:01 ` [PATCH pve-manager v4 11/17] ui: cpu model selector: allow filtering out custom models Arthur Bied-Charreton
2026-04-30 16:01 ` [PATCH pve-manager v4 12/17] ui: add basic custom CPU model editor Arthur Bied-Charreton
2026-04-30 16:01 ` [PATCH pve-manager v4 13/17] ui: cpu flags selector: add CPU flag editor for custom models Arthur Bied-Charreton
2026-04-30 16:01 ` [PATCH pve-manager v4 14/17] ui: cpu flags selector: fix buffered rendering error Arthur Bied-Charreton
2026-04-30 16:01 ` [PATCH pve-manager v4 15/17] ui: cpu flags selector: allow filtering out flags supported on 0 nodes Arthur Bied-Charreton
2026-04-30 16:01 ` [PATCH pve-manager v4 16/17] ui: cpu flags selector: add search bar for large lists of flags Arthur Bied-Charreton
2026-04-30 16:01 ` [PATCH pve-manager v4 17/17] RFC: ui: group custom CPU with resource mappings Arthur Bied-Charreton
2026-05-06 14:31 ` [PATCH docs/manager/qemu-server v4 00/17] Add API and UI for custom CPU models David Riley
2026-05-07 7:14 ` Arthur Bied-Charreton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ee16a91e-11d4-4974-beeb-794cf3ed2b82@proxmox.com \
--to=f.ebner@proxmox.com \
--cc=a.bied-charreton@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox