]> git.proxmox.com Git - qemu-server.git/commitdiff
Use nr_hugepages from /proc/cmdline
authorKamil Trzciński <ayufan@ayufan.eu>
Sun, 17 Feb 2019 12:39:37 +0000 (13:39 +0100)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Mon, 18 Feb 2019 09:39:18 +0000 (10:39 +0100)
Currently Proxmox VE always deallocates HugePagesTLB
when starting a new machine and it makes it impossible
to preconfigure kernel /proc/cmdline with persistent allocation.

This change makes deallocation to prefer defaults set by /proc/cmdline,
by parsing the cmdline and respecting hugepages= and hugepagesz=.

Signed-off-by: Kamil Trzciński <ayufan@ayufan.eu>
PVE/QemuServer/Memory.pm

index 0e4c83086fa70dc6146a4b0a408ac8a99fed69ac..aac4cf429e314e0a576bc727cb276647cd15a1ed 100644 (file)
@@ -538,6 +538,29 @@ sub hugepages_allocate {
 
 }
 
+sub hugepages_default_nr_hugepages {
+    my ($size) = @_;
+
+    my $cmdline = PVE::Tools::file_read_firstline("/proc/cmdline");
+    my $args = PVE::Tools::split_args($cmdline);
+
+    my $parsed_size = 2; # default is 2M
+
+    foreach my $arg (@$args) {
+       if ($arg eq "hugepagesz=2M") {
+           $parsed_size = 2;
+       } elsif ($arg eq "hugepagesz=1G") {
+           $parsed_size = 1024;
+       } elsif ($arg =~ m/^hugepages=(\d+)?$/) {
+           if ($parsed_size == $size) {
+               return $1;
+           }
+       }
+    }
+
+    return 0;
+}
+
 sub hugepages_pre_deallocate {
     my ($hugepages_topology) = @_;
 
@@ -545,8 +568,8 @@ sub hugepages_pre_deallocate {
 
        my $hugepages_size = $size * 1024;
        my $path = "/sys/kernel/mm/hugepages/hugepages-${hugepages_size}kB/";
-       my $hugepages_nr = PVE::Tools::file_read_firstline($path."nr_hugepages");
-       PVE::ProcFSTools::write_proc_entry($path."nr_hugepages", 0);
+       my $hugepages_nr = hugepages_default_nr_hugepages($size);
+       PVE::ProcFSTools::write_proc_entry($path."nr_hugepages", $hugepages_nr);
     }
 }