[pve-devel] [PATCH 3/4] move qemu_memory_hotplug && qemu_dimm_list to QemuServer::Memory

Alexandre Derumier aderumier at odiso.com
Mon May 23 09:47:51 CEST 2016


Signed-off-by: Alexandre Derumier <aderumier at odiso.com>
---
 PVE/QemuServer.pm        | 90 ++----------------------------------------------
 PVE/QemuServer/Memory.pm | 89 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 91 insertions(+), 88 deletions(-)

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index c4ebcf7..ce95884 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -3786,92 +3786,6 @@ sub qemu_cpu_hotplug {
     }
 }
 
-sub qemu_memory_hotplug {
-    my ($vmid, $conf, $defaults, $opt, $value) = @_;
-
-    return $value if !check_running($vmid);
-
-    my $memory = $conf->{memory} || $defaults->{memory};
-    $value = $defaults->{memory} if !$value;
-    return $value if $value == $memory;
-
-    my $static_memory = $STATICMEM;
-    my $dimm_memory = $memory - $static_memory;
-
-    die "memory can't be lower than $static_memory MB" if $value < $static_memory;
-    die "you cannot add more memory than $MAX_MEM MB!\n" if $memory > $MAX_MEM;
-
-
-    my $sockets = 1;
-    $sockets = $conf->{sockets} if $conf->{sockets};
-
-    if($value > $memory) {
-
-    	PVE::QemuServer::Memory::foreach_dimm($conf, $vmid, $value, $sockets, sub {
-	    my ($conf, $vmid, $name, $dimm_size, $numanode, $current_size, $memory) = @_;
-
-		return if $current_size <= $conf->{memory};
-
-		eval { vm_mon_cmd($vmid, "object-add", 'qom-type' => "memory-backend-ram", id => "mem-$name", props => { size => int($dimm_size*1024*1024) } ) };
-		if (my $err = $@) {
-		    eval { qemu_objectdel($vmid, "mem-$name"); };
-		    die $err;
-		}
-
-		eval { vm_mon_cmd($vmid, "device_add", driver => "pc-dimm", id => "$name", memdev => "mem-$name", node => $numanode) };
-		if (my $err = $@) {
-		    eval { qemu_objectdel($vmid, "mem-$name"); };
-		    die $err;
-		}
-		#update conf after each succesful module hotplug
-		$conf->{memory} = $current_size;
-		PVE::QemuConfig->write_config($vmid, $conf);
-	});
-
-    } else {
-
-    	PVE::QemuServer::Memory::foreach_reverse_dimm($conf, $vmid, $value, $sockets, sub {
-	    my ($conf, $vmid, $name, $dimm_size, $numanode, $current_size, $memory) = @_;
-
-		return if $current_size >= $conf->{memory};
-		print "try to unplug memory dimm $name\n";
-
-		my $retry = 0;
-	        while (1) {
-		    eval { qemu_devicedel($vmid, $name) };
-		    sleep 3;
-		    my $dimm_list = qemu_dimm_list($vmid);
-		    last if !$dimm_list->{$name};
-		    raise_param_exc({ $name => "error unplug memory module" }) if $retry > 5;
-		    $retry++;
-		}
-
-		#update conf after each succesful module unplug
-		$conf->{memory} = $current_size;
-
-		eval { qemu_objectdel($vmid, "mem-$name"); };
-		PVE::QemuConfig->write_config($vmid, $conf);
-	});
-    }
-}
-
-sub qemu_dimm_list {
-    my ($vmid) = @_;
-
-    my $dimmarray = vm_mon_cmd_nocheck($vmid, "query-memory-devices");
-    my $dimms = {};
-
-    foreach my $dimm (@$dimmarray) {
-
-        $dimms->{$dimm->{data}->{id}}->{id} = $dimm->{data}->{id};
-        $dimms->{$dimm->{data}->{id}}->{node} = $dimm->{data}->{node};
-        $dimms->{$dimm->{data}->{id}}->{addr} = $dimm->{data}->{addr};
-        $dimms->{$dimm->{data}->{id}}->{size} = $dimm->{data}->{size};
-        $dimms->{$dimm->{data}->{id}}->{slot} = $dimm->{data}->{slot};
-    }
-    return $dimms;
-}
-
 sub qemu_block_set_io_throttle {
     my ($vmid, $deviceid,
 	$bps, $bps_rd, $bps_wr, $iops, $iops_rd, $iops_wr,
@@ -4139,7 +4053,7 @@ sub vmconfig_hotplug_pending {
 		vmconfig_delete_or_detach_drive($vmid, $storecfg, $conf, $opt, $force);
 	    } elsif ($opt =~ m/^memory$/) {
 		die "skip\n" if !$hotplug_features->{memory};
-		qemu_memory_hotplug($vmid, $conf, $defaults, $opt);
+		PVE::QemuServer::Memory::qemu_memory_hotplug($vmid, $conf, $defaults, $opt);
 	    } elsif ($opt eq 'cpuunits') {
 		cgroups_write("cpu", $vmid, "cpu.shares", $defaults->{cpuunits});
 	    } elsif ($opt eq 'cpulimit') {
@@ -4196,7 +4110,7 @@ sub vmconfig_hotplug_pending {
 				     $vmid, $opt, $value, 1);
 	    } elsif ($opt =~ m/^memory$/) { #dimms
 		die "skip\n" if !$hotplug_features->{memory};
-		$value = qemu_memory_hotplug($vmid, $conf, $defaults, $opt, $value);
+		$value = PVE::QemuServer::Memory::qemu_memory_hotplug($vmid, $conf, $defaults, $opt, $value);
 	    } elsif ($opt eq 'cpuunits') {
 		cgroups_write("cpu", $vmid, "cpu.shares", $conf->{pending}->{$opt});
 	    } elsif ($opt eq 'cpulimit') {
diff --git a/PVE/QemuServer/Memory.pm b/PVE/QemuServer/Memory.pm
index fe12d4f..48224f2 100644
--- a/PVE/QemuServer/Memory.pm
+++ b/PVE/QemuServer/Memory.pm
@@ -2,7 +2,10 @@ package PVE::QemuServer::Memory;
 
 use strict;
 use warnings;
+use PVE::QemuServer;
 
+my $MAX_MEM = 4194304;
+my $STATICMEM = 1024;
 
 sub foreach_dimm{
     my ($conf, $vmid, $memory, $sockets, $func) = @_;
@@ -46,5 +49,91 @@ sub foreach_reverse_dimm {
     }
 }
 
+sub qemu_memory_hotplug {
+    my ($vmid, $conf, $defaults, $opt, $value) = @_;
+
+    return $value if !check_running($vmid);
+
+    my $memory = $conf->{memory} || $defaults->{memory};
+    $value = $defaults->{memory} if !$value;
+    return $value if $value == $memory;
+
+    my $static_memory = $STATICMEM;
+    my $dimm_memory = $memory - $static_memory;
+
+    die "memory can't be lower than $static_memory MB" if $value < $static_memory;
+    die "you cannot add more memory than $MAX_MEM MB!\n" if $memory > $MAX_MEM;
+
+
+    my $sockets = 1;
+    $sockets = $conf->{sockets} if $conf->{sockets};
+
+    if($value > $memory) {
+
+    	foreach_dimm($conf, $vmid, $value, $sockets, sub {
+	    my ($conf, $vmid, $name, $dimm_size, $numanode, $current_size, $memory) = @_;
+
+		return if $current_size <= $conf->{memory};
+
+		eval { PVE::QemuServer::vm_mon_cmd($vmid, "object-add", 'qom-type' => "memory-backend-ram", id => "mem-$name", props => { size => int($dimm_size*1024*1024) } ) };
+		if (my $err = $@) {
+		    eval { PVE::QemuServer::qemu_objectdel($vmid, "mem-$name"); };
+		    die $err;
+		}
+
+		eval { PVE::QemuServer::vm_mon_cmd($vmid, "device_add", driver => "pc-dimm", id => "$name", memdev => "mem-$name", node => $numanode) };
+		if (my $err = $@) {
+		    eval { PVE::QemuServer::qemu_objectdel($vmid, "mem-$name"); };
+		    die $err;
+		}
+		#update conf after each succesful module hotplug
+		$conf->{memory} = $current_size;
+		PVE::QemuConfig->write_config($vmid, $conf);
+	});
+
+    } else {
+
+    	foreach_reverse_dimm($conf, $vmid, $value, $sockets, sub {
+	    my ($conf, $vmid, $name, $dimm_size, $numanode, $current_size, $memory) = @_;
+
+		return if $current_size >= $conf->{memory};
+		print "try to unplug memory dimm $name\n";
+
+		my $retry = 0;
+	        while (1) {
+		    eval { PVE::QemuServer::qemu_devicedel($vmid, $name) };
+		    sleep 3;
+		    my $dimm_list = qemu_dimm_list($vmid);
+		    last if !$dimm_list->{$name};
+		    raise_param_exc({ $name => "error unplug memory module" }) if $retry > 5;
+		    $retry++;
+		}
+
+		#update conf after each succesful module unplug
+		$conf->{memory} = $current_size;
+
+		eval { PVE::QemuServer::qemu_objectdel($vmid, "mem-$name"); };
+		PVE::QemuConfig->write_config($vmid, $conf);
+	});
+    }
+}
+
+sub qemu_dimm_list {
+    my ($vmid) = @_;
+
+    my $dimmarray = PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "query-memory-devices");
+    my $dimms = {};
+
+    foreach my $dimm (@$dimmarray) {
+
+        $dimms->{$dimm->{data}->{id}}->{id} = $dimm->{data}->{id};
+        $dimms->{$dimm->{data}->{id}}->{node} = $dimm->{data}->{node};
+        $dimms->{$dimm->{data}->{id}}->{addr} = $dimm->{data}->{addr};
+        $dimms->{$dimm->{data}->{id}}->{size} = $dimm->{data}->{size};
+        $dimms->{$dimm->{data}->{id}}->{slot} = $dimm->{data}->{slot};
+    }
+    return $dimms;
+}
+
 1;
 
-- 
2.1.4




More information about the pve-devel mailing list