On June 12, 2025 4:02 pm, Fiona Ebner wrote: > 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);
this is done in generate_throttle_group as well, and the var is not used here? > + 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); same > + 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 > > > _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel