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

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 22ff875..21fa84c 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -67,6 +67,58 @@ 
PVE::JSONSchema::register_standard_option('pve-snapshot-name', {
 
 #no warnings 'redefine';
 
+sub cgroups_create {
+   my ($controller, $vmid) = @_;
+
+   my $pid = check_running($vmid, 1);
+   return if !$pid;
+
+   my $vm_path = cgroups_path($controller, $vmid);
+   return if !$vm_path;
+
+   dir_glob_foreach("/proc/$pid/task/", '(\d+)', sub {
+       my ($task) = @_;
+
+       PVE::ProcFSTools::write_proc_entry("$vm_path/tasks", $task);
+   });
+
+}
+
+sub cgroups_delete {
+   my ($controller, $vmid) = @_;
+
+   return if check_running($vmid, 1);
+
+   my $vm_path = cgroups_path($controller, $vmid);
+   return if !$vm_path;
+
+   rmdir $vm_path;
+}
+
+sub cgroups_write {
+   my ($controller, $vmid, $option, $value) = @_;
+
+   my $vm_path = cgroups_path($controller, $vmid);
+   return if !$vm_path;
+
+   PVE::ProcFSTools::write_proc_entry("$vm_path/$option", $value);
+
+}
+
+sub cgroups_path {
+   my ($controller, $vmid) = @_;
+
+   my $root_path = "/sys/fs/cgroup/";
+   my $controller_path = $root_path.$controller."/qemu";
+   my $vm_path = $controller_path."/".$vmid;
+
+   return undef if (! -d $root_path);
+   mkdir $controller_path if (! -d $controller_path);
+   mkdir $vm_path if (! -d $vm_path);
+
+   return $vm_path;
+}
+
 unless(defined(&_VZSYSCALLS_H_)) {
     eval 'sub _VZSYSCALLS_H_ () {1;}' unless defined(&_VZSYSCALLS_H_);
     require 'sys/syscall.ph';
@@ -4282,6 +4334,12 @@ sub vm_start {
                    property => "guest-stats-polling-interval",
                    value => 2) if (!defined($conf->{balloon}) || 
$conf->{balloon});
 
+        my $cpuunits = defined($conf->{cpuunits}) ?
+            $conf->{cpuunits} : $defaults->{cpuunits};
+       
+       cgroups_create("cpu", $vmid);
+       cgroups_write("cpu", $vmid, "cpu.shares", $cpuunits);
+       
     });
 }
 
@@ -4393,6 +4451,7 @@ sub vm_stop_cleanup {
     my ($storecfg, $vmid, $conf, $keepActive, $apply_pending_changes) = @_;
 
     eval {
+       cgroups_delete("cpu", $vmid);
        fairsched_rmnod($vmid); # try to destroy group
 
        if (!$keepActive) {
@@ -4549,6 +4608,7 @@ sub vm_destroy {
        check_lock($conf) if !$skiplock;
 
        if (!check_running($vmid)) {
+           cgroups_delete("cpu", $vmid);
            fairsched_rmnod($vmid); # try to destroy group
            destroy_vm($storecfg, $vmid);
        } else {
-- 
2.1.4

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

Reply via email to