On 16/04/2024 14:20, Fabian Grünbichler wrote: > if the new value is higher than the old one, check against limits. if the old > one is higher, then the change is always okay, to support reducing the usage in > steps spread over multiple guests.. > > Signed-off-by: Fabian Grünbichler > --- > PVE/API2/Qemu.pm | 22 ++++++++++++++++++++++ > PVE/QemuServer.pm | 7 +++++++ > PVE/QemuServer/Memory.pm | 6 ++++++ > 3 files changed, 35 insertions(+) > > diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm > index f0ff785c..adbc6557 100644 > --- a/PVE/API2/Qemu.pm > +++ b/PVE/API2/Qemu.pm > @@ -1863,6 +1863,28 @@ my $update_vm_api = sub { > } > }; > > + # check pool limits, but only if values increase, ignoring > + # deletions and pending values > + my $usage = PVE::QemuConfig->get_pool_usage($conf); > + if (defined($param->{sockets}) || defined($param->{cores})) { > + my $old = $usage->{cpu}; Git complained about this line: Applying: update/hotplug: handle pool limits .git/rebase-apply/patch:19: space before tab in indent. my $old = $usage->{cpu}; warning: 1 line adds whitespace errors. > + my $new = $param->{sockets} || $usage->{sockets}; > + $new *= ($param->{cores} || $usage->{cores}); > + > + if ($new > $old) { > + my $change = { cpu => $new - $old }; > + PVE::GuestHelpers::check_guest_pool_limit($vmid, $change); > + } > + } elsif (defined($param->{memory})) { > + my $old = $usage->{mem}; > + my $new = PVE::QemuServer::Memory::get_current_memory($param->{memory})*1024*1024; > + > + if ($new > $old) { > + my $change = { mem => $new - $old }; > + PVE::GuestHelpers::check_guest_pool_limit($vmid, $change); > + } > + } > + > foreach my $opt (@delete) { > $modified->{$opt} = 1; > $conf = PVE::QemuConfig->load_config($vmid); # update/reload > diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm > index 93eaaec5..be937ec1 100644 > --- a/PVE/QemuServer.pm > +++ b/PVE/QemuServer.pm > @@ -4617,6 +4617,13 @@ sub qemu_cpu_hotplug { > } > > return; > + } else { > + my $changes = { > + absolute => 1, > + running => 1, > + cpu => $vcpus, > + }; > + PVE::GuestHelpers::check_guest_pool_limit($vmid, $changes); > } > > my $currentrunningvcpus = mon_cmd($vmid, "query-cpus-fast"); > diff --git a/PVE/QemuServer/Memory.pm b/PVE/QemuServer/Memory.pm > index f365f2d1..b27b8b2b 100644 > --- a/PVE/QemuServer/Memory.pm > +++ b/PVE/QemuServer/Memory.pm > @@ -234,6 +234,12 @@ sub qemu_memory_hotplug { > die "you cannot add more memory than max mem $MAX_MEM MB!\n" if $value > $MAX_MEM; > > if ($value > $memory) { > + my $changes = { > + absolute => 1, Shouldn't this be relative as the memory value is calculated as... > + running => 1, > + mem => $memory - $value, the difference between the old and new value? Also, I can only guess from the context that these values are in MiB, which would mean that this should be converted to bytes, but I could be totally wrong here. Unfortunately, I'm unsure how to trigger this hotplug (as it only seems to be called by `vmconfig_hotplug_pending`, which is called in `do_import` and after another pool limit check in `update_vm_api`, so the first call will always die first) without changing the code too much. I'd be happy to know when this code gets executed. > + }; > + PVE::GuestHelpers::check_guest_pool_limit($vmid, $changes); > > my $numa_hostmap; > > -- > 2.39.2