From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id C2DC1D98C for ; Fri, 2 Dec 2022 13:59:36 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id A3E3134C0E for ; Fri, 2 Dec 2022 13:59:36 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for ; Fri, 2 Dec 2022 13:59:35 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 4A43044796 for ; Fri, 2 Dec 2022 13:59:35 +0100 (CET) From: Fiona Ebner To: pve-devel@lists.proxmox.com Date: Fri, 2 Dec 2022 13:59:31 +0100 Message-Id: <20221202125931.57214-1-f.ebner@proxmox.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.027 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [qemuserver.pm, proxmox.com] Subject: [pve-devel] [PATCH qemu-server] cfg2cmd: factor out ovmf drives printing X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Dec 2022 12:59:36 -0000 No functional change is intended. Signed-off-by: Fiona Ebner --- Popped out while trying the other approach mentioned in: https://lists.proxmox.com/pipermail/pve-devel/2022-December/055091.html Better viewed with --color-moved=zebra --color-moved-ws=ignore-all-space or similar. PVE/QemuServer.pm | 114 +++++++++++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 48 deletions(-) diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index a52a883e..619908de 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -3514,6 +3514,68 @@ my sub should_disable_smm { $vga->{type} && $vga->{type} =~ m/^(serial\d+|none)$/; } +my sub print_ovmf_drive_commandlines { + my ($conf, $storecfg, $vmid, $arch, $q35, $version_guard) = @_; + + my $d; + if (my $efidisk = $conf->{efidisk0}) { + $d = parse_drive('efidisk0', $efidisk); + } + + my ($ovmf_code, $ovmf_vars) = get_ovmf_files($arch, $d, $q35); + die "uefi base image '$ovmf_code' not found\n" if ! -f $ovmf_code; + + my ($path, $format); + my $read_only_str = ''; + if ($d) { + 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); + } + + $read_only_str = ',readonly=on' if drive_is_read_only($conf, $d); + } else { + log_warn("no efidisk configured! Using temporary efivars disk."); + $path = "/tmp/$vmid-ovmf.fd"; + PVE::Tools::file_copy($ovmf_vars, $path, -s $ovmf_vars); + $format = 'raw'; + } + + my $size_str = ""; + + if ($format eq 'raw' && $version_guard->(4, 1, 2)) { + $size_str = ",size=" . (-s $ovmf_vars); + } + + # SPI flash does lots of read-modify-write OPs, without writeback this gets really slow #3329 + my $cache = ""; + if ($path =~ m/^rbd:/) { + $cache = ',cache=writeback'; + $path .= ':rbd_cache_policy=writeback'; # avoid write-around, we *need* to cache writes too + } + + my $code_drive_str = "if=pflash,unit=0,format=raw,readonly=on,file=$ovmf_code"; + my $var_drive_str = "if=pflash" + . ",unit=1" + . "$cache" + . ",format=$format" + . ",id=drive-efidisk0" + . "$size_str" + . ",file=$path" + . "$read_only_str"; + + return ($code_drive_str, $var_drive_str); +} + sub config_to_command { my ($storecfg, $vmid, $conf, $defaults, $forcemachine, $forcecpu, $pbs_backing) = @_; @@ -3633,54 +3695,10 @@ sub config_to_command { } if ($conf->{bios} && $conf->{bios} eq 'ovmf') { - my $d; - if (my $efidisk = $conf->{efidisk0}) { - $d = parse_drive('efidisk0', $efidisk); - } - - my ($ovmf_code, $ovmf_vars) = get_ovmf_files($arch, $d, $q35); - die "uefi base image '$ovmf_code' not found\n" if ! -f $ovmf_code; - - my ($path, $format); - my $read_only_str = ''; - if ($d) { - 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); - } - - $read_only_str = ',readonly=on' if drive_is_read_only($conf, $d); - } else { - log_warn("no efidisk configured! Using temporary efivars disk."); - $path = "/tmp/$vmid-ovmf.fd"; - PVE::Tools::file_copy($ovmf_vars, $path, -s $ovmf_vars); - $format = 'raw'; - } - - my $size_str = ""; - - if ($format eq 'raw' && $version_guard->(4, 1, 2)) { - $size_str = ",size=" . (-s $ovmf_vars); - } - - # SPI flash does lots of read-modify-write OPs, without writeback this gets really slow #3329 - my $cache = ""; - if ($path =~ m/^rbd:/) { - $cache = ',cache=writeback'; - $path .= ':rbd_cache_policy=writeback'; # avoid write-around, we *need* to cache writes too - } - - push @$cmd, '-drive', "if=pflash,unit=0,format=raw,readonly=on,file=$ovmf_code"; - push @$cmd, '-drive', "if=pflash,unit=1$cache,format=$format,id=drive-efidisk0$size_str,file=${path}${read_only_str}"; + my ($code_drive_str, $var_drive_str) = + print_ovmf_drive_commandlines($conf, $storecfg, $vmid, $arch, $q35, $version_guard); + push $cmd->@*, '-drive', $code_drive_str; + push $cmd->@*, '-drive', $var_drive_str; } if ($q35) { # tell QEMU to load q35 config early -- 2.30.2