From b2ec957bf82517d73350db6d4abcea11ebcd59ad Mon Sep 17 00:00:00 2001
From: Patrick Bellasi <patrick.bellasi@arm.com>
Date: Tue, 29 Nov 2016 10:02:57 +0000
Subject: [PATCH] shutils/cgroups: fix run_into support

In the previous patch:
  cgroups: Mount cgroups controllers in devlib working dir
we changed the default mount point for devlib managed CGroups but forgot to
update the support for execution of a workload within a specified CGroup.

The run_into support is provide by a shutil script, which still has hardcoded
the old path (i.e. /sys/fs/cgroup/devlib_*). This patch fixes this by:
- resetting the default path to the Linux standard /sys/fs/cgroup
- use-sing the existing CGMOUNT env variable to specify which CGroups mount
  point to use

The cgroups::run_into is also updated to use the self.cgroup_root via
CGMOUNT when the shutils' script is called.
Moreover, an additional cgroups::run_into_cmd method is added which just
returns a properly formatted run_into shutils' call.

Signed-off-by: Patrick Bellasi <patrick.bellasi@arm.com>
---
 devlib/bin/scripts/shutils.in |  2 +-
 devlib/module/cgroups.py      | 16 ++++++++++++----
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/devlib/bin/scripts/shutils.in b/devlib/bin/scripts/shutils.in
index 640d65d..fa4ad93 100755
--- a/devlib/bin/scripts/shutils.in
+++ b/devlib/bin/scripts/shutils.in
@@ -102,7 +102,7 @@ cgroups_get_attributes() {
 cgroups_run_into() {
 
 	# Control groups mount point
-	CGMOUNT=${CGMOUNT:-/sys/fs/cgroup/devlib_*}
+	CGMOUNT=${CGMOUNT:-/sys/fs/cgroup}
 	# The control group we want to run into
 	CGP=${1}
 	shift 1
diff --git a/devlib/module/cgroups.py b/devlib/module/cgroups.py
index dd9543e..001867b 100644
--- a/devlib/module/cgroups.py
+++ b/devlib/module/cgroups.py
@@ -314,6 +314,10 @@ class CgroupsModule(Module):
 
         self.logger = logging.getLogger('CGroups')
 
+        # Set Devlib's CGroups mount point
+        self.cgroup_root = target.path.join(
+            target.working_directory, 'cgroups')
+
         # Load list of available controllers
         controllers = []
         subsys = self.list_subsystems()
@@ -329,9 +333,7 @@ class CgroupsModule(Module):
             if not controller.probe(self.target):
                 continue
             try:
-                cgroup_root = target.path.join(target.working_directory,
-                                               'cgroups')
-                controller.mount(self.target, cgroup_root)
+                controller.mount(self.target, self.cgroup_root)
             except TargetError:
                 message = 'cgroups {} controller is not supported by the target'
                 raise TargetError(message.format(controller.kind))
@@ -359,12 +361,18 @@ class CgroupsModule(Module):
             return None
         return self.controllers[kind]
 
+    def run_into_cmd(self, cgroup, cmdline):
+        return 'CGMOUNT={} {} cgroups_run_into {} {}'\
+                .format(self.cgroup_root, self.target.shutils,
+                        cgroup, cmdline)
+
     def run_into(self, cgroup, cmdline):
         """
         Run the specified command into the specified CGroup
         """
         return self.target._execute_util(
-            'cgroups_run_into {} {}'.format(cgroup, cmdline),
+            'CGMOUNT={} cgroups_run_into {} {}'\
+                .format(self.cgroup_root, cgroup, cmdline),
             as_root=True)