return the more recent cpu model compatible with host cpu

Signed-off-by: Alexandre Derumier <aderum...@odiso.com>
---
 PVE/QemuServer/CPUConfig.pm | 46 +++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/PVE/QemuServer/CPUConfig.pm b/PVE/QemuServer/CPUConfig.pm
index 45bf26f..63e57d4 100644
--- a/PVE/QemuServer/CPUConfig.pm
+++ b/PVE/QemuServer/CPUConfig.pm
@@ -14,6 +14,7 @@ our @EXPORT_OK = qw(
 print_cpu_device
 get_cpu_options
 get_host_cpu_flags
+find_best_cpumodel
 );
 
 # under certain race-conditions, this module might be loaded before pve-cluster
@@ -696,6 +697,51 @@ sub get_host_cpu_flags {
     return $res;
 }
 
+sub find_best_cpumodel {
+    my ($host_flags, $vendor) = @_;
+
+    my $res = {};
+
+    #flags in qemu model but not in cpuinfo
+    my $missing_flag = {
+       #qemu internal
+       'svme-addr-chk' => 1,
+       #TCG exposes CPUID flags FSRM, FZRM, FSRS, FSRC.
+       #These do not correspond to any new instructions; 
+       #they only direct software to use string operations even if the length 
is zero or short.
+       fzrm => 1,
+       fsrc => 1,
+       fsr => 1,
+       fsrs => 1,
+       #masked from cpuinfo
+       xfd => 1,
+    };
+
+    foreach my $cpu (keys %$qemu_cpu_models) {
+       next if $qemu_cpu_models->{$cpu}->{vendor} ne $vendor;
+       next if $qemu_cpu_models->{$cpu}->{model} == 0;
+       $res->{$cpu} = $qemu_cpu_models->{$cpu};
+       my $flags = $qemu_cpu_models->{$cpu}->{'flags'};
+       next if !$flags;
+       foreach my $flag (keys %$flags) {
+           next if $missing_flag->{$flag};
+           if (!$host_flags->{$flag}) {
+               #print"$cpu unsupported flag: $flag\n";
+               delete $res->{$cpu};
+           }
+       }
+    }
+
+    foreach my $name (sort {
+                       $res->{$b}->{family} <=> $res->{$a}->{family} ||
+                       $res->{$b}->{model} <=> $res->{$a}->{model} ||
+                       $res->{$b}->{version} <=> $res->{$a}->{version}
+                   } keys %$res) {
+       return $name;
+    }
+}
+
+
 __PACKAGE__->register();
 __PACKAGE__->init();
 
-- 
2.30.2


_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to