]> git.proxmox.com Git - qemu-server.git/blobdiff - PVE/QemuServer.pm
fix #1662: use special case for 'snapshot' disk parameter
[qemu-server.git] / PVE / QemuServer.pm
index 42c412a72e4aafc53cfbfbff37de7f48cb7f9b75..acd4047a62830099377e0bea0af1475bef27eb97 100644 (file)
@@ -108,17 +108,28 @@ my $cpu_vendor_list = {
     coreduo => 'GenuineIntel',
     core2duo => 'GenuineIntel',
     Conroe  => 'GenuineIntel',
-    Penryn  => 'GenuineIntel', 
+    Penryn  => 'GenuineIntel',
     Nehalem  => 'GenuineIntel',
+    'Nehalem-IBRS'  => 'GenuineIntel',
     Westmere => 'GenuineIntel',
+    'Westmere-IBRS' => 'GenuineIntel',
     SandyBridge => 'GenuineIntel',
+    'SandyBridge-IBRS' => 'GenuineIntel',
     IvyBridge => 'GenuineIntel',
+    'IvyBridge-IBRS' => 'GenuineIntel',
     Haswell => 'GenuineIntel',
+    'Haswell-IBRS' => 'GenuineIntel',
     'Haswell-noTSX' => 'GenuineIntel',
+    'Haswell-noTSX-IBRS' => 'GenuineIntel',
     Broadwell => 'GenuineIntel',
+    'Broadwell-IBRS' => 'GenuineIntel',
     'Broadwell-noTSX' => 'GenuineIntel',
+    'Broadwell-noTSX-IBRS' => 'GenuineIntel',
     'Skylake-Client' => 'GenuineIntel',
-    
+    'Skylake-Client-IBRS' => 'GenuineIntel',
+    'Skylake-Server' => 'GenuineIntel',
+    'Skylake-Server-IBRS' => 'GenuineIntel',
+
     # AMD CPUs
     athlon => 'AuthenticAMD',
     phenom  => 'AuthenticAMD',
@@ -134,8 +145,11 @@ my $cpu_vendor_list = {
     kvm64 => 'default',
     qemu32 => 'default',
     qemu64 => 'default',
+    max => 'default',
 };
 
+my $cpu_flag = qr/[+-](pcid|spec-ctrl)/;
+
 my $cpu_fmt = {
     cputype => {
        description => "Emulated CPU type.",
@@ -150,6 +164,15 @@ my $cpu_fmt = {
        optional => 1,
        default => 0
     },
+    flags => {
+       description => "List of additional CPU flags separated by ';'."
+                    . " Use '+FLAG' to enable, '-FLAG' to disable a flag."
+                    . " Currently supported flags: 'pcid', 'spec-ctrl'.",
+       format_description => '+FLAG[;-FLAG...]',
+       type => 'string',
+       pattern => qr/$cpu_flag(;$cpu_flag)*/,
+       optional => 1,
+    },
 };
 
 my $watchdog_fmt = {
@@ -1599,10 +1622,17 @@ sub print_drive_full {
    }
 
     my $opts = '';
-    my @qemu_drive_options = qw(heads secs cyls trans media format cache snapshot rerror werror aio discard);
+    my @qemu_drive_options = qw(heads secs cyls trans media format cache rerror werror aio discard);
     foreach my $o (@qemu_drive_options) {
        $opts .= ",$o=$drive->{$o}" if $drive->{$o};
     }
+
+    # snapshot only accepts on|off
+    if (defined($drive->{snapshot})) {
+       my $v = $drive->{snapshot} ? 'on' : 'off';
+       $opts .= ",snapshot=$v";
+    }
+
     foreach my $type (['', '-total'], [_rd => '-read'], [_wr => '-write']) {
        my ($dir, $qmpname) = @$type;
        if (my $v = $drive->{"mbps$dir"}) {
@@ -2645,6 +2675,8 @@ sub vmstatus {
 
         $d->{template} = PVE::QemuConfig->is_template($conf);
 
+       $d->{serial} = 1 if conf_has_serial($conf);
+
        $res->{$vmid} = $d;
     }
 
@@ -2839,6 +2871,18 @@ sub foreach_volid {
     }
 }
 
+sub conf_has_serial {
+    my ($conf) = @_;
+
+    for (my $i = 0; $i < $MAX_SERIAL_PORTS; $i++)  {
+       if ($conf->{"serial$i"}) {
+           return 1;
+       }
+    }
+
+    return 0;
+}
+
 sub vga_conf_has_spice {
     my ($vga) = @_;
 
@@ -2908,20 +2952,27 @@ sub config_to_command {
        die "uefi base image not found\n" if ! -f $OVMF_CODE;
 
        my $path;
-       my $format = 'raw';
+       my $format;
        if (my $efidisk = $conf->{efidisk0}) {
            my $d = PVE::JSONSchema::parse_property_string($efidisk_fmt, $efidisk);
            my ($storeid, $volname) = PVE::Storage::parse_volume_id($d->{file}, 1);
+           $format = $d->{format};
            if ($storeid) {
                $path = PVE::Storage::path($storecfg, $d->{file});
+               if (!defined($format)) {
+                   my $scfg = PVE::Storage::storage_config($storecfg, $storeid);
+                   $format = qemu_img_format($scfg, $volname);
+               }
            } else {
                $path = $d->{file};
+               die "efidisk format must be specified\n"
+                   if !defined($format);
            }
-           $format = $d->{format} if $d->{format};
        } else {
            warn "no efidisk configured! Using temporary efivars disk.\n";
            $path = "/tmp/$vmid-ovmf.fd";
            PVE::Tools::file_copy($OVMF_VARS, $path, -s $OVMF_VARS);
+           $format = 'raw';
        }
 
        push @$cmd, '-drive', "if=pflash,unit=0,format=raw,readonly,file=$OVMF_CODE";
@@ -3136,6 +3187,10 @@ sub config_to_command {
            or die "Cannot parse cpu description: $cputype\n";
        $cpu = $cpuconf->{cputype};
        $kvm_off = 1 if $cpuconf->{hidden};
+
+       if (defined(my $flags = $cpuconf->{flags})) {
+           push @$cpuFlags, split(";", $flags);
+       }
     }
 
     push @$cpuFlags , '+lahf_lm' if $cpu eq 'kvm64';
@@ -4667,7 +4722,8 @@ sub vm_start {
        my $cpuunits = defined($conf->{cpuunits}) ? $conf->{cpuunits}
                                                  : $defaults->{cpuunits};
 
-       my %run_params = (timeout => $statefile ? undef : 30, umask => 0077);
+       my $start_timeout = $conf->{hugepages} ? 300 : 30;
+       my %run_params = (timeout => $statefile ? undef : $start_timeout, umask => 0077);
 
        my %properties = (
            Slice => 'qemu.slice',
@@ -5298,6 +5354,13 @@ sub restore_update_config_line {
        } else {
            print $outfd $line;
        }
+    } elsif (($line =~ m/^(smbios1: )(.*)/) && $unique) {
+       my ($uuid, $uuid_str);
+       UUID::generate($uuid);
+       UUID::unparse($uuid, $uuid_str);
+       my $smbios1 = parse_smbios1($2);
+       $smbios1->{uuid} = $uuid_str;
+       print $outfd $1.print_smbios1($smbios1)."\n";
     } else {
        print $outfd $line;
     }