[pve-devel] [PATCH v2 qemu-server 04/12] Adapt CPUConfig to handle custom models
Stefan Reiter
s.reiter at proxmox.com
Wed Oct 2 10:24:30 CEST 2019
Thanks for the review, I'll prepare a v3 :)
Just some clarifications inline for this patch.
On 10/2/19 7:49 AM, Thomas Lamprecht wrote:
> On 9/30/19 12:58 PM, Stefan Reiter wrote:
>> Turn CPUConfig into a SectionConfig with parsing/writing support for
>> custom CPU models. IO is handled using cfs.
>>
>> The "custom" parameter provides differentiation between custom and
>> default types, even if the name is the same ('namespacing').
>>
>> Signed-off-by: Stefan Reiter <s.reiter at proxmox.com>
>> ---
>> PVE/QemuServer/CPUConfig.pm | 59 ++++++++++++++++++++++++++++++++++---
>> 1 file changed, 55 insertions(+), 4 deletions(-)
>>
>> diff --git a/PVE/QemuServer/CPUConfig.pm b/PVE/QemuServer/CPUConfig.pm
>> index c994228..3fde987 100644
>> --- a/PVE/QemuServer/CPUConfig.pm
>> +++ b/PVE/QemuServer/CPUConfig.pm
>> @@ -3,6 +3,8 @@ package PVE::QemuServer::CPUConfig;
>> 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';
>> our @EXPORT_OK = qw(
>> @@ -11,6 +13,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',
>> @@ -80,11 +91,27 @@ 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.",
>> type => 'string',
>> - enum => [ sort { "\L$a" cmp "\L$b" } keys %$cpu_vendor_list ],
>> + format_description => 'string',
>> default => 'kvm64',
>> default_key => 1,
>> + optional => 1,
>> + },
>> + custom => {
>> + description => "True if 'cputype' is a custom model, false if otherwise.",
>
> maybe negate it and call it built-in? We use that as name for Permission roles which
> are generated by code, we probably want to call this also built-in in the UI, and be
> it only to re-use translations ;)
> >> + type => 'boolean',
>> + default => 0,
>> + 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 { "\L$a" cmp "\L$b" } keys %$cpu_vendor_list ],
>
> we do not use \L at all in our code, AFAICT, just use the a bit more
> expressive, or at least already used all over the place, lc()
>
TBH I just moved that part from the existing "cputype" enum, but I can
change it in v3 - it sure looks clearer with lc().
>> + default => 'kvm64',
>> + custom_only => 1,
> . ^^^^^^^^^^^
> That's a fake JSONSchema attribute, we do not do those normally, either
> some mechanism gets added to JSONSchema to really represent this in general
> or just omit it.
> >> + optional => 1,
>> },
>> hidden => {
>> description => "Do not identify as a KVM virtual machine.",
>> @@ -102,14 +129,34 @@ our $cpu_fmt = {
>> flags => {
>> description => "List of additional CPU flags separated by ';'."
>> . " Use '+FLAG' to enable, '-FLAG' to disable a flag."
>> - . " Currently supported flags: @{[join(', ', @supported_cpu_flags)]}.",
>> + . " Custom CPU models can specify any flag supported by"
>> + . " QEMU/KVM, VM-specific flags must be from the following"
>> + . " set for security reasons: @{[join(', ', @supported_cpu_flags)]}.",
>
> is the last part still true if the pattern restriction to $cpu_flag are lifted
> below?
>
Yes, because it is checked in verify_vm_cpu_conf from patch 06/12. I
admit it's not entirely clear from just looking at this property
definition, but it was the only way I could think of to somewhat cleanly
handle the re-use of $cpu_fmt for VM-specific settings and custom models
- maybe I'll add a comment.
>> format_description => '+FLAG[;-FLAG...]',
>> type => 'string',
>> - pattern => qr/$cpu_flag(;$cpu_flag)*/,
>> + pattern => qr/[+-][a-zA-Z0-9\-_\.]+(;[+-][a-zA-Z0-9\-_\.]+)*/,
>> optional => 1,
>> },
>> };
>>
>> +# 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) = @_;
>> @@ -248,4 +295,8 @@ sub qemu_machine_feature_enabled {
>> $current_minor >= $version_minor);
>> }
>>
>> +
>> +__PACKAGE__->register();
>> +__PACKAGE__->init();
>> +
>> 1;
>>
>
>
>
More information about the pve-devel
mailing list