The throttle group will be referenced via the 'blockdev' schema. Co-developed-by: Alexandre Derumier <alexandre.derum...@groupe-cyllene.com> Signed-off-by: Fiona Ebner <f.eb...@proxmox.com> --- PVE/QemuServer.pm | 51 ++++++++++++++++++++++++++++++++++++++ PVE/QemuServer/Blockdev.pm | 44 ++++++++++++++++++++++++++++++++ PVE/QemuServer/Makefile | 1 + 3 files changed, 96 insertions(+) create mode 100644 PVE/QemuServer/Blockdev.pm
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index e5f8a607..bfadba98 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -51,6 +51,7 @@ use PVE::Tools qw(run_command file_read_firstline file_get_contents dir_glob_for use PVE::QMPClient; use PVE::QemuConfig; use PVE::QemuConfig::NoWrite; +use PVE::QemuServer::Blockdev; use PVE::QemuServer::Helpers qw(config_aware_timeout min_version kvm_user_version windows_version); use PVE::QemuServer::Cloudinit; use PVE::QemuServer::CGroup; @@ -3943,6 +3944,12 @@ sub config_to_command { push @$devices, '-blockdev', $live_restore->{blockdev}; } + if (min_version($machine_version, 10, 0)) { + my $drive_id = PVE::QemuServer::Drive::get_drive_id($drive); + my $throttle_group = PVE::QemuServer::Blockdev::generate_throttle_group($drive); + push @$cmd, '-object', to_json($throttle_group, { canonical => 1 }); + } + my $drive_cmd = print_drive_commandline_full($storecfg, $vmid, $drive, $live_blockdev_name); # extra protection for templates, but SATA and IDE don't support it.. @@ -4315,6 +4322,14 @@ sub qemu_iothread_del { sub qemu_driveadd { my ($storecfg, $vmid, $device) = @_; + my $machine_type = PVE::QemuServer::Machine::get_current_qemu_machine($vmid); + + if (PVE::QemuServer::Machine::is_machine_version_at_least($machine_type, 10, 0)) { + my $drive_id = PVE::QemuServer::Drive::get_drive_id($device); + my $throttle_group = PVE::QemuServer::Blockdev::generate_throttle_group($device); + mon_cmd($vmid, 'object-add', %$throttle_group); + } + my $drive = print_drive_commandline_full($storecfg, $vmid, $device, undef); $drive =~ s/\\/\\\\/g; my $ret = PVE::QemuServer::Monitor::hmp_cmd($vmid, "drive_add auto \"$drive\"", 60); @@ -4328,6 +4343,12 @@ sub qemu_driveadd { sub qemu_drivedel { my ($vmid, $deviceid) = @_; + my $machine_type = PVE::QemuServer::Machine::get_current_qemu_machine($vmid); + + if (PVE::QemuServer::Machine::is_machine_version_at_least($machine_type, 10, 0)) { + mon_cmd($vmid, 'object-del', id => 'throttle-drive-$deviceid'); + } + my $ret = PVE::QemuServer::Monitor::hmp_cmd($vmid, "drive_del drive-$deviceid", 10 * 60); $ret =~ s/^\s+//; @@ -4571,6 +4592,36 @@ sub qemu_block_set_io_throttle { return if !check_running($vmid) ; + my $machine_type = PVE::QemuServer::Machine::get_current_qemu_machine($vmid); + if (PVE::QemuServer::Machine::is_machine_version_at_least($machine_type, 10, 0)) { + mon_cmd( + $vmid, + 'qom-set', + path => "throttle-$deviceid", + property => "limits", + value => { + 'bps-total' => int($bps), + 'bps-read' => int($bps_rd), + 'bps-write' => int($bps_wr), + 'iops-total' => int($iops), + 'iops-read' => int($iops_rd), + 'iops-write' => int($iops_wr), + 'bps-total-max' => int($bps_max), + 'bps-read-max' => int($bps_rd_max), + 'bps-write-max' => int($bps_wr_max), + 'iops-total-max' => int($iops_max), + 'iops-read-max' => int($iops_rd_max), + 'iops-write-max' => int($iops_wr_max), + 'bps-total-max-length' => int($bps_max_length), + 'bps-read-max-length' => int($bps_rd_max_length), + 'bps-write-max-length' => int($bps_wr_max_length), + 'iops-total-max-length' => int($iops_max_length), + 'iops-read-max-length' => int($iops_rd_max_length), + 'iops-write-max-length' => int($iops_wr_max_length), + } + ); + } + mon_cmd($vmid, "block_set_io_throttle", device => $deviceid, bps => int($bps), bps_rd => int($bps_rd), diff --git a/PVE/QemuServer/Blockdev.pm b/PVE/QemuServer/Blockdev.pm new file mode 100644 index 00000000..b1150141 --- /dev/null +++ b/PVE/QemuServer/Blockdev.pm @@ -0,0 +1,44 @@ +package PVE::QemuServer::Blockdev; + +use strict; +use warnings; + +use PVE::QemuServer::Drive; + +sub generate_throttle_group { + my ($drive) = @_; + + my $drive_id = PVE::QemuServer::Drive::get_drive_id($drive); + + my $limits = {}; + + for my $type (['', '-total'], [_rd => '-read'], [_wr => '-write']) { + my ($dir, $qmpname) = @$type; + if (my $v = $drive->{"mbps$dir"}) { + $limits->{"bps$qmpname"} = int($v*1024*1024); + } + if (my $v = $drive->{"mbps${dir}_max"}) { + $limits->{"bps$qmpname-max"} = int($v*1024*1024); + } + if (my $v = $drive->{"bps${dir}_max_length"}) { + $limits->{"bps$qmpname-max-length"} = int($v); + } + if (my $v = $drive->{"iops${dir}"}) { + $limits->{"iops$qmpname"} = int($v); + } + if (my $v = $drive->{"iops${dir}_max"}) { + $limits->{"iops$qmpname-max"} = int($v); + } + if (my $v = $drive->{"iops${dir}_max_length"}) { + $limits->{"iops$qmpname-max-length"} = int($v); + } + } + + return { + id => "throttle-drive-$drive_id", + limits => $limits, + 'qom-type' => 'throttle-group', + }; +} + +1; diff --git a/PVE/QemuServer/Makefile b/PVE/QemuServer/Makefile index bbd5b5c0..8054a93b 100644 --- a/PVE/QemuServer/Makefile +++ b/PVE/QemuServer/Makefile @@ -1,4 +1,5 @@ SOURCES=PCI.pm \ + Blockdev.pm \ RNG.pm \ USB.pm \ Memory.pm \ -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel