[pve-devel] [PATCH v2 qemu-server 4/6] update/hotplug: handle pool limits

Daniel Kral d.kral at proxmox.com
Thu Dec 19 17:09:07 CET 2024


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.gruenbichler at 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









More information about the pve-devel mailing list