[pve-devel] [PATCH qemu-server] fix #2570: add 'keephugepages' config

Stefan Reiter s.reiter at proxmox.com
Wed Feb 12 14:32:28 CET 2020


We already keep hugepages if they are created with the kernel
commandline (hugepagesz=x hugepages=y), but some setups (specifically
hugepages across multiple NUMA nodes) cannot be configured that way.
Since we always clear these hugepages at VM shutdown, rebooting a VM
that uses them might not work, since the requested count might not be
available anymore by the time we want to use them (also, we would then
no longer allocate them correctly on the NUMA nodes).

Add a 'keephugepages' parameter to skip cleanup and simply leave them
untouched.

Signed-off-by: Stefan Reiter <s.reiter at proxmox.com>
---

I tried adding it as a 'keep' sub-parameter first (i.e.
'hugepages: 1024,keep=1' etc.), but it turns out that we hardcode
$config->{hugepages} to be a numeric string in a *lot* of different places, so I
opted for this variant instead. Open for suggestions ofc.

 PVE/QemuServer.pm | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 23176dd..4741707 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -384,6 +384,14 @@ EODESC
 	description => "Enable/disable hugepages memory.",
 	enum => [qw(any 2 1024)],
     },
+    keephugepages => {
+	optional => 1,
+	type => 'boolean',
+	default => 0,
+	description => "Use together with hugepages. If enabled, hugepages will"
+		     . " not be deleted after VM shutdown and can be used for"
+		     . " subsequent starts.",
+    },
     vcpus => {
 	optional => 1,
 	type => 'integer',
@@ -5441,11 +5449,13 @@ sub vm_start {
 
 		eval { $run_qemu->() };
 		if (my $err = $@) {
-		    PVE::QemuServer::Memory::hugepages_reset($hugepages_host_topology);
+		    PVE::QemuServer::Memory::hugepages_reset($hugepages_host_topology)
+			if !$conf->{keephugepages};
 		    die $err;
 		}
 
-		PVE::QemuServer::Memory::hugepages_pre_deallocate($hugepages_topology);
+		PVE::QemuServer::Memory::hugepages_pre_deallocate($hugepages_topology)
+		    if !$conf->{keephugepages};
 	    };
 	    eval { PVE::QemuServer::Memory::hugepages_update_locked($code); };
 
-- 
2.20.1




More information about the pve-devel mailing list