config
------
hugepages: 2|1024

2: enable 2M hugepages
1024 : enable 1G hugepages

1G hugepages need to be enable at boot with grub option : hugepagesz=1G,
and it's working only on new processor (>westmere for intel processor and also 
recent amd)

This is working with or without numa

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

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 4840c73..8829077 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -210,6 +210,12 @@ my $confdesc = {
        minimum => 16,
        default => 512,
     },
+    hugepages => {
+       optional => 1,
+       type => 'string',
+       description => "enable manual hugetlbfs allocation",
+       enum => [qw(2 1024)],
+    },
     balloon => {
         optional => 1,
         type => 'integer',
@@ -2744,8 +2750,49 @@ sub config_to_command {
     my $memory =  $conf->{memory} || $defaults->{memory};
     push @$cmd, '-m', $memory;
 
+    my $hugepages_mountpoint = "/dev/hugepages-$conf->{hugepages}M" if 
$conf->{hugepages};
+
+    if($conf->{hugepages}){
+
+       #check if hugepages are available
+
+       my $hugepages_syspath = 
"/sys/kernel/mm/hugepages/hugepages-".($conf->{hugepages}*1024)."kB";
+       die "$conf->{hugepages}M hugepages are not available (1G hugepages need 
to be enable with hugepagesz=1G in grub)" if !(-d $hugepages_syspath);
+
+       #allocate hugepages if needed
+       my $hugepages_free = 
PVE::Tools::file_read_firstline($hugepages_syspath."/free_hugepages");
+       my $hugepages_memoryfree = $hugepages_free * $conf->{hugepages};
+       if($hugepages_memoryfree < $memory){
+           my $hugepages_neededmemory = $memory - $hugepages_memoryfree;
+           my $hugepages_neededpages = POSIX::ceil($hugepages_neededmemory / 
$conf->{hugepages});
+           my $hugepages_current = 
PVE::Tools::file_read_firstline($hugepages_syspath."/nr_hugepages");
+
+           
PVE::ProcFSTools::write_proc_entry("$hugepages_syspath/nr_hugepages", 
$hugepages_current + $hugepages_neededpages);
+       }
+
+       #mount the hugetlbfs
+       my $fd = IO::File->new("/proc/mounts", "r") ||
+           die "unable to open /proc/mounts - $!\n";
+       my $mounted = undef;
+
+       while (defined(my $line = <$fd>)) {
+           my ($dev, $path, $fstype) = split(/\s+/, $line);
+           $mounted = 1 if($fstype eq 'hugetlbfs' && $path eq 
$hugepages_mountpoint);
+       }
+       close($fd);
+       
+       if(!$mounted){
+            mkdir $hugepages_mountpoint if !(-d $hugepages_mountpoint);
+           my $cmd = ['/bin/mount', '-t', 'hugetlbfs', 'none', 
$hugepages_mountpoint, '-o', "pagesize=$conf->{hugepages}M"];
+           run_command($cmd, errmsg => "mount error");
+       }
+    }
+
     if ($conf->{numa}) {
 
+       my $hugepages = $hugepages_mountpoint ? 
",mem-path=$hugepages_mountpoint" : "";
+       my $backend = $hugepages_mountpoint ? 
'memory-backend-file,prealloc=yes' : 'memory-backend-ram';
+
        my $numa_totalmemory = undef;
        for (my $i = 0; $i < $MAX_NUMA; $i++) {
            next if !$conf->{"numa$i"};
@@ -2755,7 +2802,7 @@ sub config_to_command {
            die "missing numa node$i memory value\n" if !$numa->{memory};
            my $numa_memory = $numa->{memory};
            $numa_totalmemory += $numa_memory;
-           my $numa_object = 
"memory-backend-ram,id=ram-node$i,size=$numa_memory"."M";
+           my $numa_object = 
"$backend$hugepages,id=ram-node$i$hugepages,size=$numa_memory"."M";
 
            # cpus
            my $cpus_start = $numa->{cpus}->{start};
@@ -2806,11 +2853,14 @@ sub config_to_command {
                my $cpuend = ($cpustart + $cores - 1) if $cores && $cores > 1;
                my $cpus = $cpustart;
                $cpus .= "-$cpuend" if $cpuend;
-
-               push @$cmd, '-object', 
"memory-backend-ram,size=$numa_memory,id=ram-node$i";
+               
+               push @$cmd, '-object', 
"$backend$hugepages,size=$numa_memory,id=ram-node$i";
                push @$cmd, '-numa', 
"node,nodeid=$i,cpus=$cpus,memdev=ram-node$i";
            }
        }
+    }else{
+
+       push @$cmd, '-mem-prealloc','-mem-path', $hugepages_mountpoint if 
$conf->{hugepages};
     }
 
     push @$cmd, '-S' if $conf->{freeze};
-- 
1.7.10.4

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

Reply via email to