From: Wolfgang Bumiller <w.bumil...@proxmox.com>

Signed-off-by: Wolfgang Bumiller <w.bumil...@proxmox.com>
---
 src/PVE/LXC/CGroup.pm | 46 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/src/PVE/LXC/CGroup.pm b/src/PVE/LXC/CGroup.pm
index d67bf65..b3e31c0 100644
--- a/src/PVE/LXC/CGroup.pm
+++ b/src/PVE/LXC/CGroup.pm
@@ -14,6 +14,7 @@ use warnings;
 
 use POSIX qw();
 
+use PVE::ProcFSTools;
 use PVE::Tools qw(
     file_get_contents
     file_read_firstline
@@ -297,4 +298,49 @@ sub get_memory_stat {
     return $res;
 }
 
+# Change the memory limit for this container.
+#
+# Dies on error (including a not-running or currently-shutting-down guest).
+sub change_memory_limit {
+    my ($self, $mem_bytes, $swap_bytes) = @_;
+
+    if (cgroup_mode() == 2) {
+       if (defined(my $path = $self->get_path('memory'))) {
+           PVE::ProcFSTools::write_proc_entry("$path/memory.swap.max", 
$swap_bytes)
+               if defined($swap_bytes);
+           PVE::ProcFSTools::write_proc_entry("$path/memory.max", $mem_bytes)
+               if defined($mem_bytes);
+           return 1;
+       }
+    } elsif (defined(my $path = $self->get_path('memory'))) {
+       # With cgroupv1 we cannot control memory and swap limits separately.
+       # This also means that since the two values aren't independent, we need 
to handle
+       # growing and shrinking separately.
+       my $path_mem = "$path/memory.limit_in_bytes";
+       my $path_memsw = "$path/memory.memsw.limit_in_bytes";
+
+       my $old_mem_bytes = file_get_contents($path_mem);
+       my $old_memsw_bytes = file_get_contents($path_memsw);
+       chomp($old_mem_bytes, $old_memsw_bytes);
+
+       $mem_bytes //= $old_mem_bytes;
+       my $memsw_bytes = defined($swap_bytes) ? ($mem_bytes + $swap_bytes) : 
$old_memsw_bytes;
+
+       if ($memsw_bytes > $old_memsw_bytes) {
+           # Growing the limit means growing the combined limit first, then 
pulling the
+           # memory limitup.
+           PVE::ProcFSTools::write_proc_entry($path_memsw, $memsw_bytes);
+           PVE::ProcFSTools::write_proc_entry($path_mem, $mem_bytes);
+       } else {
+           # Shrinking means we first need to shrink the mem-only memsw cannot 
be
+           # shrunk below it.
+           PVE::ProcFSTools::write_proc_entry($path_mem, $mem_bytes);
+           PVE::ProcFSTools::write_proc_entry($path_memsw, $memsw_bytes);
+       }
+       return 1;
+    }
+
+    die "trying to change memory cgroup values: container not running\n";
+}
+
 1;
-- 
2.20.1


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

Reply via email to