[pve-devel] [PATCH qemu-server 5/7] Support custom CPU types in get_cpu_options
Stefan Reiter
s.reiter at proxmox.com
Mon Sep 2 16:27:57 CEST 2019
Supports custom basemodels (model shown to QEMU, i.e. must be a default
model), vendors and (host-)phys-bits for VMs with large amounts of RAM
(see bug #2318).
Signed-off-by: Stefan Reiter <s.reiter at proxmox.com>
---
PVE/QemuServer.pm | 32 +++++++++++++++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 97fa955..417bea8 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -37,6 +37,7 @@ use PVE::QemuServer::PCI qw(print_pci_addr print_pcie_addr);
use PVE::QemuServer::Memory;
use PVE::QemuServer::USB qw(parse_usb_device);
use PVE::QemuServer::Cloudinit;
+use PVE::QemuServer::CustomCPUConfig;
use PVE::SysFSTools;
use PVE::Systemd;
use Time::HiRes qw(gettimeofday);
@@ -3595,10 +3596,30 @@ sub get_cpu_options {
$cpu = 'cortex-a57';
}
my $hv_vendor_id;
+ my $custom_cpu_config;
if (my $cputype = $conf->{cpu}) {
my $cpuconf = PVE::JSONSchema::parse_property_string($cpu_fmt, $cputype)
or die "Cannot parse cpu description: $cputype\n";
$cpu = $cpuconf->{cputype};
+
+ if (!defined($cpu_vendor_list->{$cpu})) {
+ # not a default CPU model, read config and see if $cpu is name of
+ # a custom model
+ my $cpu_models = PVE::QemuServer::CustomCPUConfig::config_from_file();
+ if ($cpu_models && ($custom_cpu_config = $cpu_models->get_model_by_name($cpu))) {
+ $cpu = $custom_cpu_config->{basemodel};
+
+ # 'basemodel' could be custom as well
+ while (!defined($cpu_vendor_list->{$cpu})) {
+ my $custom_base = $cpu_models->get_model_by_name($cpu);
+ die "unknown CPU basemodel: $cpu\n" if !$custom_base;
+ $cpu = $custom_base->{basemodel};
+ }
+ } else {
+ die "unknown CPU model (neither default nor custom): $cpu\n";
+ }
+ }
+
$kvm_off = 1 if $cpuconf->{hidden};
$hv_vendor_id = $cpuconf->{'hv-vendor-id'};
@@ -3628,13 +3649,22 @@ sub get_cpu_options {
push @$cpuFlags, 'kvm=off' if $kvm_off;
- if (my $cpu_vendor = $cpu_vendor_list->{$cpu}) {
+ if (defined($custom_cpu_config) && (my $custom_vendor = $custom_cpu_config->{vendor})) {
+ push @$cpuFlags, "vendor=${custom_vendor}"
+ if $custom_vendor ne 'default';
+ } elsif (my $cpu_vendor = $cpu_vendor_list->{$cpu}) {
push @$cpuFlags, "vendor=${cpu_vendor}"
if $cpu_vendor ne 'default';
} elsif ($arch ne 'aarch64') {
die "internal error"; # should not happen
}
+ $cpu .= ",host-phys-bits=true"
+ if defined($custom_cpu_config) && $custom_cpu_config->{'host-phys-bits'};
+ $cpu .= ",phys-bits=$custom_cpu_config->{'phys-bits'}"
+ if defined($custom_cpu_config) && $custom_cpu_config->{'phys-bits'}
+ && !$custom_cpu_config->{'host-phys-bits'};
+
$cpu .= "," . join(',', @$cpuFlags) if scalar(@$cpuFlags);
return ('-cpu', $cpu);
--
2.20.1
More information about the pve-devel
mailing list