[pve-devel] [PATCH 3/4] cpu hotplug : add cpu hot-unplug support

Wolfgang Bumiller w.bumiller at proxmox.com
Wed Oct 12 16:36:09 CEST 2016


On Tue, Sep 06, 2016 at 12:41:55PM +0200, Alexandre Derumier wrote:
> Signed-off-by: Alexandre Derumier <aderumier at odiso.com>
> ---
>  PVE/QemuServer.pm | 31 +++++++++++++++++++++++++++++--
>  1 file changed, 29 insertions(+), 2 deletions(-)
> 
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> index d3092ba..8e840f5 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -3683,6 +3683,9 @@ sub qemu_usb_hotplug {
>  sub qemu_cpu_hotplug {
>      my ($vmid, $conf, $vcpus) = @_;
>  
> +    my $machine_type = PVE::QemuServer::get_current_qemu_machine($vmid);
> +    my $kvmver = kvm_user_version();

Note that this calls out to the qemu binary rather than querying the
currently running qemu process, which is probably what you meant to
query instead.

We could add an alternative using the query-version qmp command for this
purpose.

AFAIC the other (and I hope *all* other) calls to
qemu_machine_feature_enabled() using this variable are in
config_to_command() or functions reached only through that, where the
current behavior is fine.

> +
>      my $sockets = 1;
>      $sockets = $conf->{smp} if $conf->{smp}; # old style - no longer iused
>      $sockets = $conf->{sockets} if  $conf->{sockets};
> @@ -3695,8 +3698,32 @@ sub qemu_cpu_hotplug {
>  	if $vcpus > $maxcpus;
>  
>      my $currentvcpus = $conf->{vcpus} || $maxcpus;
> -    die "online cpu unplug is not yet possible\n"
> -	if $vcpus < $currentvcpus;
> +
> +    if ($vcpus < $currentvcpus) { 
> +
> +	if (qemu_machine_feature_enabled ($machine_type, $kvmver, 2, 7)) {
> +
> +	    for (my $i = $currentvcpus; $i > $vcpus; $i--) {
> +		qemu_devicedel($vmid, "cpu$i");
> +		my $retry = 0;
> +		my $currentrunningvcpus = undef;
> +		while (1) {
> +		    $currentrunningvcpus = vm_mon_cmd($vmid, "query-cpus");
> +		    last if scalar(@{$currentrunningvcpus}) == $i-1;
> +		    raise_param_exc({ "cpu unplug" => "error unplug cpu$i" }) if $retry > 5;
> +		    $retry++;
> +		    sleep 1;
> +		}
> +		#update conf after each succesfull cpu unplug
> +		$conf->{vcpus} = scalar(@{$currentrunningvcpus});
> +		PVE::QemuConfig->write_config($vmid, $conf);
> +	    }
> +	} else {
> +	    die "online cpu unplug is only possible since qemu 2.7\n"
> +	}
> +
> +	return;
> +    }
>  
>      my $currentrunningvcpus = vm_mon_cmd($vmid, "query-cpus");
>      die "vcpus in running vm is different than configuration\n"
> -- 
> 2.1.4
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel




More information about the pve-devel mailing list