On Tue, Sep 06, 2016 at 12:41:55PM +0200, Alexandre Derumier wrote:
> Signed-off-by: Alexandre Derumier <aderum...@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@pve.proxmox.com
> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

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

Reply via email to