simple use dimm_list() returned by qemu

Signed-off-by: Alexandre Derumier <aderum...@odiso.com>
---
 PVE/QemuServer/Memory.pm | 73 ++++++++++++----------------------------
 1 file changed, 22 insertions(+), 51 deletions(-)

diff --git a/PVE/QemuServer/Memory.pm b/PVE/QemuServer/Memory.pm
index a13b3a1..cf1ddb9 100644
--- a/PVE/QemuServer/Memory.pm
+++ b/PVE/QemuServer/Memory.pm
@@ -217,38 +217,6 @@ sub foreach_dimm{
     }
 }
 
-sub foreach_reverse_dimm {
-    my ($conf, $vmid, $memory, $sockets, $func) = @_;
-
-    my $dimm_id = 253;
-    my $current_size = 0;
-    my $dimm_size = 0;
-
-    if($conf->{hugepages} && $conf->{hugepages} == 1024) {
-       $current_size = 8355840;
-       $dimm_size = 131072;
-    } else {
-       $current_size = 4177920;
-       $dimm_size = 65536;
-    }
-
-    return if $current_size == $memory;
-
-    my @numa_map = get_numa_node_list($conf);
-
-    for (my $j = 0; $j < 8; $j++) {
-       for (my $i = 0; $i < 32; $i++) {
-           my $name = "dimm${dimm_id}";
-           $dimm_id--;
-           my $numanode = $numa_map[(31-$i) % @numa_map];
-           $current_size -= $dimm_size;
-           &$func($conf, $vmid, $name, $dimm_size, $numanode, $current_size, 
$memory);
-           return  $current_size if $current_size <= $memory;
-       }
-       $dimm_size /= 2;
-    }
-}
-
 sub qemu_memory_hotplug {
     my ($vmid, $conf, $value) = @_;
 
@@ -322,30 +290,33 @@ sub qemu_memory_hotplug {
 
     } else {
 
-       foreach_reverse_dimm($conf, $vmid, $value, $sockets, sub {
-           my ($conf, $vmid, $name, $dimm_size, $numanode, $current_size, 
$memory) = @_;
+       my $dimms = qemu_dimm_list($vmid);
+       my $current_size = $memory;
+       for my $name (sort { $dimms->{$b}{slot} <=> $dimms->{$a}{slot} } keys 
%$dimms) {
 
-               return if $current_size >= get_current_memory($conf->{memory});
+           my $dimm_size = $dimms->{$name}->{size} / 1024 / 1024;
 
-               print "try to unplug memory dimm $name\n";
+           last if $current_size <= $value;
 
-               my $retry = 0;
-               while (1) {
-                   eval { PVE::QemuServer::qemu_devicedel($vmid, $name) };
-                   sleep 3;
-                   my $dimm_list = qemu_memdevices_list($vmid, '^dimm(\d+)$');
-                   last if !$dimm_list->{$name};
-                   raise_param_exc({ $name => "error unplug memory module" }) 
if $retry > 5;
-                   $retry++;
-               }
+           print "try to unplug memory dimm $name\n";
 
-               #update conf after each succesful module unplug
-               $newmem->{current} = $current_size;
-               $conf->{memory} = print_memory($newmem);
+           my $retry = 0;
+           while (1) {
+               eval { PVE::QemuServer::qemu_devicedel($vmid, $name) };
+               sleep 3;
+               my $dimm_list = qemu_memdevices_list($vmid, '^dimm(\d+)$');
+               last if !$dimm_list->{$name};
+               raise_param_exc({ $name => "error unplug memory module" }) if 
$retry > 5;
+               $retry++;
+           }
+           $current_size -= $dimm_size;
+           #update conf after each succesful module unplug
+           $newmem->{current} = $current_size;
+           $conf->{memory} = print_memory($newmem);
 
-               eval { PVE::QemuServer::qemu_objectdel($vmid, "mem-$name"); };
-               PVE::QemuConfig->write_config($vmid, $conf);
-       });
+           eval { PVE::QemuServer::qemu_objectdel($vmid, "mem-$name"); };
+           PVE::QemuConfig->write_config($vmid, $conf);
+       }
     }
     return $conf->{memory};
 }
-- 
2.30.2


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

Reply via email to