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

Reply via email to