public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [RFC PATCH qemu-server] memory: deallocate hugepages on cleanup
@ 2026-07-10 12:51 Maximiliano Sandoval
  0 siblings, 0 replies; only message in thread
From: Maximiliano Sandoval @ 2026-07-10 12:51 UTC (permalink / raw)
  To: pve-devel

Right before VM startup the hugepages_allocate call would increase the number of
persistent hugepages (at
/sys/kernel/mm/hugepages/hugepages-{size}kB/nr_hugepages) based on the guest and
host numa topologies, then the VM is started, and immediately after the
hugepages_pre_deallocate would set the nr_hugepages back to the original value.

>From the HugeTLB Pages documentation [1]:

Caveat: Shrinking the persistent huge page pool via ``nr_hugepages`` such that
it becomes less than the number of huge pages in use will convert the balance
of the in-use huge pages to surplus huge pages.  This will occur even if
the number of surplus pages would exceed the overcommit value.  As long as
this condition holds--that is, until ``nr_hugepages+nr_overcommit_hugepages`` is
increased sufficiently, or the surplus huge pages go out of use and are freed--
no more surplus huge pages will be allowed to be allocated.

In a setup where nr_overcommit_hugepages is 0, if the KVM process frees its
hugepages, the number of surplus hugepages can potentially be above
`nr_overcommit_hugepages` and no new surplus will be allowed to be allocated by
the process.

This can be reproduced as follows:

On a setup with 1 numa node, create a Linux VM, then configure it as follows:

$ qm set <vmid> --numa 1 --hugepages 2 --balloon 1

If one then starts the VM, the nr_hugepages would decrease monotonically and the
VM would get stuck during its boot process.

We address this by deferring the de-allocation until qm cleanup.

[1] https://www.kernel.org/doc/html/latest/admin-guide/mm/hugetlbpage.html

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
 src/PVE/CLI/qm.pm     | 8 ++++++++
 src/PVE/QemuServer.pm | 3 ---
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/PVE/CLI/qm.pm b/src/PVE/CLI/qm.pm
index b903c1f1..8a88fb48 100755
--- a/src/PVE/CLI/qm.pm
+++ b/src/PVE/CLI/qm.pm
@@ -1137,6 +1137,14 @@ __PACKAGE__->register_method({
                 die "skipping cleanup - 'rollback' lock is present\n"
                     if $conf->{lock} && $conf->{lock} eq 'rollback';
 
+                my $hotplug_features =
+                    PVE::QemuServer::parse_hotplug_features(defined($conf->{hotplug}) ? $conf->{hotplug} : '1');
+                my $hugepages_topology =
+                    PVE::QemuServer::Memory::hugepages_topology($conf, $hotplug_features->{memory});
+
+                PVE::QemuServer::Memory::hugepages_pre_deallocate($hugepages_topology)
+                    if !$conf->{keephugepages};
+
                 if (!$clean) {
                     # we have to cleanup the tap devices after a crash
 
diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index 59a37098..23d5aa9f 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -5840,9 +5840,6 @@ sub vm_start_nolock {
                     if !$conf->{keephugepages};
                 die $err;
             }
-
-            PVE::QemuServer::Memory::hugepages_pre_deallocate($hugepages_topology)
-                if !$conf->{keephugepages};
         };
         eval { PVE::QemuServer::Memory::hugepages_update_locked($code); };
 
-- 
2.47.3





^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2026-07-10 12:51 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-10 12:51 [RFC PATCH qemu-server] memory: deallocate hugepages on cleanup Maximiliano Sandoval

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal