Special care is taken not to overwrite any special flags, or ones manually set on the VM by the user. We warn if a flag is overruled.
Signed-off-by: Stefan Reiter <s.rei...@proxmox.com> --- PVE/QemuServer.pm | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index 417bea8..7cc1674 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -3597,6 +3597,7 @@ sub get_cpu_options { } my $hv_vendor_id; my $custom_cpu_config; + my @vm_specific_flags; if (my $cputype = $conf->{cpu}) { my $cpuconf = PVE::JSONSchema::parse_property_string($cpu_fmt, $cputype) or die "Cannot parse cpu description: $cputype\n"; @@ -3624,7 +3625,8 @@ sub get_cpu_options { $hv_vendor_id = $cpuconf->{'hv-vendor-id'}; if (defined(my $flags = $cpuconf->{flags})) { - push @$cpuFlags, split(";", $flags); + @vm_specific_flags = split(";", $flags); + push @$cpuFlags, @vm_specific_flags; } } @@ -3649,6 +3651,28 @@ sub get_cpu_options { push @$cpuFlags, 'kvm=off' if $kvm_off; + if (defined($custom_cpu_config) && defined($custom_cpu_config->{flags})) { + my @custom_flags = split(/;/, $custom_cpu_config->{flags}); + foreach my $flag (@custom_flags) { + # find index of $flag in $cpuFlags while ignoring prefix [+-=] + $flag =~ m/^[+-=]?(.*)$/; + my $match_flag = $1; + my @match_index = grep { $cpuFlags->[$_] =~ m/[+-=]?\Q$match_flag/ } + 0..scalar(@$cpuFlags)-1; + + if (@match_index) { + my $other_flag = $cpuFlags->[$match_index[0]]; + # warn only if prefix differs and flag is not vm specific + warn "warning: custom CPU model flag '$flag' overruled by '$other_flag' due to either default handling of basemodel or selected OS.\n" + if (substr $other_flag, 0, 1) ne (substr $flag, 0, 1) && + (!@vm_specific_flags || + !grep(m/[+-=]?\Q$match_flag/, @vm_specific_flags)); + } else { + push(@$cpuFlags, $flag); + } + } + } + if (defined($custom_cpu_config) && (my $custom_vendor = $custom_cpu_config->{vendor})) { push @$cpuFlags, "vendor=${custom_vendor}" if $custom_vendor ne 'default'; -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel