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 <f.gruenbich...@proxmox.com>
> ---
>  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







_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to