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