[pve-devel] [PATCH v4 qemu-server 06/12] Adapt CPUConfig to handle custom models

Fabian Grünbichler f.gruenbichler at proxmox.com
Mon Oct 14 13:11:29 CEST 2019


On October 7, 2019 2:47 pm, Stefan Reiter wrote:
> Turn CPUConfig into a SectionConfig with parsing/writing support for
> custom CPU models. IO is handled using cfs.
> 
> Namespacing will be provided using "custom-" prefix for custom model
> names (in VM config only, cpu-models.conf will contain unprefixed
> names).
> 
> Signed-off-by: Stefan Reiter <s.reiter at proxmox.com>
> ---
> 
> v4: Use "custom-" prefix instead of distinct property for namespacing as
> suggested by Thomas. Left the v3 message below, but this fixes that issue.
> 
> v3: I changed the "custom" property to "built-in" and negated its uses, as
> Thomas suggested. I'm not sure I like this too much compared to "custom" (with
> "built-in", you have to explicitly set a value in the config to 0, which looks
> weird - basically "unsetting" something to use a feature), but I'm very much
> fine with either.
> 
> 
>  PVE/QemuServer/CPUConfig.pm | 46 +++++++++++++++++++++++++++++++++++--
>  1 file changed, 44 insertions(+), 2 deletions(-)
> 
> diff --git a/PVE/QemuServer/CPUConfig.pm b/PVE/QemuServer/CPUConfig.pm
> index c55128f..6ea5811 100644
> --- a/PVE/QemuServer/CPUConfig.pm
> +++ b/PVE/QemuServer/CPUConfig.pm
> @@ -4,6 +4,8 @@ use strict;
>  use warnings;
>  
>  use PVE::JSONSchema;
> +use PVE::Cluster qw(cfs_register_file cfs_read_file);
> +use base qw(PVE::SectionConfig);
>  
>  use base 'Exporter';

while this seems to work, IMHO it's would be better to merge both 'use 
base' into a single statement..

>  our @EXPORT_OK = qw(
> @@ -12,6 +14,15 @@ get_cpu_options
>  qemu_machine_feature_enabled
>  );
>  
> +my $default_filename = "cpu-models.conf";
> +cfs_register_file($default_filename,
> +		  sub { PVE::QemuServer::CPUConfig->parse_config(@_); },
> +		  sub { PVE::QemuServer::CPUConfig->write_config(@_); });
> +
> +sub load_custom_model_conf {
> +    return cfs_read_file($default_filename);
> +}
> +
>  my $cpu_vendor_list = {
>      # Intel CPUs
>      486 => 'GenuineIntel',
> @@ -83,11 +94,20 @@ my $cpu_flag = qr/[+-](@{[join('|', @supported_cpu_flags)]})/;
>  
>  our $cpu_fmt = {
>      cputype => {
> -	description => "Emulated CPU type.",
> +	description => "Emulated CPU type. Can be default or custom name (custom model names must be prefixed with 'custom-').",
>  	type => 'string',
> -	enum => [ sort { "\L$a" cmp "\L$b" } keys %$cpu_vendor_list ],
> +	format_description => 'string',
>  	default => 'kvm64',
>  	default_key => 1,
> +	optional => 1,
> +    },
> +    'reported-model' => {
> +	description => "CPU model and vendor to report to the guest. Must be a QEMU/KVM supported model."
> +		     . " Only valid for custom CPU model definitions, default models will always report themselves to the guest OS.",
> +	type => 'string',
> +	enum => [ sort { lc("$a") cmp lc("$b") } keys %$cpu_vendor_list ],
> +	default => 'kvm64',
> +	optional => 1,
>      },
>      hidden => {
>  	description => "Do not identify as a KVM virtual machine.",
> @@ -113,6 +133,24 @@ our $cpu_fmt = {
>      },
>  };
>  
> +# Section config settings
> +my $defaultData = {
> +    # shallow copy, since SectionConfig modifies propertyList internally
> +    propertyList => { %$cpu_fmt },
> +};
> +
> +sub private {
> +    return $defaultData;
> +}
> +
> +sub options {
> +    return { %$cpu_fmt };
> +}
> +
> +sub type {
> +    return 'cpu-model';
> +}
> +
>  # Print a QEMU device node for a given VM configuration for hotplugging CPUs
>  sub print_cpu_device {
>      my ($conf, $id) = @_;
> @@ -251,4 +289,8 @@ sub qemu_machine_feature_enabled {
>  		 $current_minor >= $version_minor);
>  }
>  
> +
> +__PACKAGE__->register();
> +__PACKAGE__->init();
> +
>  1;
> -- 
> 2.20.1
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
> 
> 




More information about the pve-devel mailing list