For '-drive', qemu-server sets special cache options for EFI disk using RBD. In preparation to seamlessly switch to the new '-blockdev' interface, do the same here. Note that the issue from bug #3329, which is solved by these cache options, still affects current versions.
With -blockdev, the cache options are split up. While cache.direct and cache.no-flush can be set in the -blockdev options, cache.writeback is a front-end property and was intentionally removed from the -blockdev options by QEMU commit aaa436f998 ("block: Remove cache.writeback from blockdev-add"). It needs to be configured as the 'write-cache' property for the ide-hd/scsi-hd/virtio-blk device. The default is already 'writeback' and no cache mode can be set for an EFI drive configuration in Proxmox VE currently, so there will not be a clash. ┌─────────────┬─────────────────┬──────────────┬────────────────┐ │ │ cache.writeback │ cache.direct │ cache.no-flush │ ├─────────────┼─────────────────┼──────────────┼────────────────┤ │writeback │ on │ off │ off │ ├─────────────┼─────────────────┼──────────────┼────────────────┤ │none │ on │ on │ off │ ├─────────────┼─────────────────┼──────────────┼────────────────┤ │writethrough │ off │ off │ off │ ├─────────────┼─────────────────┼──────────────┼────────────────┤ │directsync │ off │ on │ off │ ├─────────────┼─────────────────┼──────────────┼────────────────┤ │unsafe │ on │ off │ on │ └─────────────┴─────────────────┴──────────────┴────────────────┘ Table from 'man kvm'. Signed-off-by: Fiona Ebner <f.eb...@proxmox.com> --- New in v2. src/PVE/Storage.pm | 4 ++-- src/PVE/Storage/ISCSIDirectPlugin.pm | 2 +- src/PVE/Storage/Plugin.pm | 27 +++++++++++++++++++++++++-- src/PVE/Storage/RBDPlugin.pm | 7 ++++++- src/PVE/Storage/ZFSPlugin.pm | 2 +- src/PVE/Storage/ZFSPoolPlugin.pm | 2 +- 6 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm index d671080..3b0f07e 100755 --- a/src/PVE/Storage.pm +++ b/src/PVE/Storage.pm @@ -712,7 +712,7 @@ sub abs_filesystem_path { # see the documentation for the plugin method sub qemu_blockdev_options { - my ($cfg, $volid) = @_; + my ($cfg, $volid, $options) = @_; my ($storeid, $volname) = parse_volume_id($volid); @@ -724,7 +724,7 @@ sub qemu_blockdev_options { die "cannot use volume of type '$vtype' as a QEMU blockdevice\n" if $vtype ne 'images' && $vtype ne 'iso' && $vtype ne 'import'; - return $plugin->qemu_blockdev_options($scfg, $storeid, $volname); + return $plugin->qemu_blockdev_options($scfg, $storeid, $volname, $options); } # used as last resort to adapt volnames when migrating diff --git a/src/PVE/Storage/ISCSIDirectPlugin.pm b/src/PVE/Storage/ISCSIDirectPlugin.pm index 4bf6d07..8f25577 100644 --- a/src/PVE/Storage/ISCSIDirectPlugin.pm +++ b/src/PVE/Storage/ISCSIDirectPlugin.pm @@ -106,7 +106,7 @@ sub path { } sub qemu_blockdev_options { - my ($class, $scfg, $storeid, $volname) = @_; + my ($class, $scfg, $storeid, $volname, $options) = @_; my $lun = ($class->parse_volname($volname))[1]; diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm index f162a13..7fe1b17 100644 --- a/src/PVE/Storage/Plugin.pm +++ b/src/PVE/Storage/Plugin.pm @@ -1884,7 +1884,7 @@ sub rename_volume { =head3 qemu_blockdev_options - $blockdev = $plugin->qemu_blockdev_options($scfg, $storeid, $volname) + $blockdev = $plugin->qemu_blockdev_options($scfg, $storeid, $volname, $options) Returns a hash reference with the basic options needed to open the volume via QEMU's C<-blockdev> API. This at least requires a C<< $blockdev->{driver} >> and a reference to the image, e.g. @@ -1915,11 +1915,34 @@ The storage ID. The volume name. +=item C<$options> + +A hash reference with additional options. + +=over + +=item C<< $options->{hints} >> + +A hash reference with hints indicating what the volume will be used for. This can be safely ignored +if no concrete issues are known with your plugin. For certain use cases, setting additional +(plugin-specific) options might be very beneficial however. An example is setting the correct cache +options for an EFI disk on RBD. The list of hints might get expanded in the future. + +=over + +=item C<< $options->{hints}->{'efi-disk'} >> + +(optional) If set, the volume will be used as the EFI disk of a VM, containing its OMVF variables. + +=back + +=back + =back =cut sub qemu_blockdev_options { - my ($class, $scfg, $storeid, $volname) = @_; + my ($class, $scfg, $storeid, $volname, $options) = @_; my $blockdev = {}; diff --git a/src/PVE/Storage/RBDPlugin.pm b/src/PVE/Storage/RBDPlugin.pm index 522d03c..6fa0689 100644 --- a/src/PVE/Storage/RBDPlugin.pm +++ b/src/PVE/Storage/RBDPlugin.pm @@ -494,7 +494,7 @@ sub path { } sub qemu_blockdev_options { - my ($class, $scfg, $storeid, $volname) = @_; + my ($class, $scfg, $storeid, $volname, $options) = @_; my $cmd_option = PVE::CephConfig::ceph_connect_option($scfg, $storeid); my ($name) = ($class->parse_volname($volname))[1]; @@ -532,6 +532,11 @@ sub qemu_blockdev_options { $blockdev->{'key-value-pairs'}->{keyring} = "$cmd_option->{keyring}"; } + # SPI flash does lots of read-modify-write OPs, without writeback this gets really slow #3329 + if ($options->{hints}->{'efi-disk'}) { + $blockdev->{'key-value-pairs'}->{'rbd-cache-policy'} = 'writeback'; + } + return $blockdev; } diff --git a/src/PVE/Storage/ZFSPlugin.pm b/src/PVE/Storage/ZFSPlugin.pm index 89eff3c..1392781 100644 --- a/src/PVE/Storage/ZFSPlugin.pm +++ b/src/PVE/Storage/ZFSPlugin.pm @@ -248,7 +248,7 @@ sub path { } sub qemu_blockdev_options { - my ($class, $scfg, $storeid, $volname) = @_; + my ($class, $scfg, $storeid, $volname, $options) = @_; my $name = ($class->parse_volname($volname))[1]; my $guid = $class->zfs_get_lu_name($scfg, $name); diff --git a/src/PVE/Storage/ZFSPoolPlugin.pm b/src/PVE/Storage/ZFSPoolPlugin.pm index 313d45b..302c965 100644 --- a/src/PVE/Storage/ZFSPoolPlugin.pm +++ b/src/PVE/Storage/ZFSPoolPlugin.pm @@ -162,7 +162,7 @@ sub path { } sub qemu_blockdev_options { - my ($class, $scfg, $storeid, $volname) = @_; + my ($class, $scfg, $storeid, $volname, $options) = @_; my ($path) = $class->path($scfg, $volname, $storeid); -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel