diff --git a/devlib/bin/scripts/shutils.in b/devlib/bin/scripts/shutils.in index bc47719..f69bce3 100755 --- a/devlib/bin/scripts/shutils.in +++ b/devlib/bin/scripts/shutils.in @@ -4,6 +4,7 @@ CMD=$1 shift BUSYBOX=${BUSYBOX:-__DEVLIB_BUSYBOX__} +FIND=${FIND:-$BUSYBOX find} GREP=${GREP:-$BUSYBOX grep} SED=${SED:-$BUSYBOX sed} @@ -69,6 +70,71 @@ cgroups_get_attributes() { $SED -e "s|$CONTROLLER\.||" -e "s|$CGROUP/||" } +cgroups_run_into() { + + # Control groups mount point + CGMOUNT=${CGMOUNT:-/sys/fs/cgroup/devlib_*} + # The control group we want to run into + CGP=${1} + # The command to run + CMD=${2} + + # Execution under root CGgroup + if [ "x/" == "x$CGP" ]; then + + $FIND $CGMOUNT -type d -maxdepth 0 | \ + while read CGPATH; do + # Move this shell into that control group + echo $$ > $CGPATH/cgroup.procs + echo "Moving task into root CGroup ($CGPATH)" + done + + # Execution under specified CGroup + else + + # Check if the required CGroup exists + $FIND $CGMOUNT -type d -mindepth 1 | \ + $GREP "$CGP" &>/dev/null + if [ $? -ne 0 ]; then + echo "ERROR: could not find any $CGP cgroup under $CGMOUNT" + exit 1 + fi + + $FIND $CGMOUNT -type d -mindepth 1 | \ + $GREP "$CGP" | \ + while read CGPATH; do + # Move this shell into that control group + echo $$ > $CGPATH/cgroup.procs + echo "Moving task into $CGPATH" + done + + fi + + # Execute the command + $CMD +} + +cgroups_tasks_move() { + SRC_GRP=${1} + DST_GRP=${2} + GREP_EXCLUSE=${3:-''} + + cat $SRC_GRP/tasks | while read TID; do + echo $TID > $DST_GRP/cgroup.procs + done + + [ "$GREP_EXCLUSE" = "" ] && exit 0 + + PIDS=`ps | $GREP "$GREP_EXCLUSE" | awk '{print $2}'` + PIDS=`echo $PIDS` + echo "PIDs to save: [$PIDS]" + for TID in $PIDS; do + CMDLINE=`cat /proc/$TID/cmdline` + echo "$TID : $CMDLINE" + echo $TID > $SRC_GRP/cgroup.procs + done +} + ################################################################################ # Main Function Dispatcher ################################################################################ @@ -92,6 +158,12 @@ cpufreq_trace_all_frequencies) cgroups_get_attributes) cgroups_get_attributes $* ;; +cgroups_run_into) + cgroups_run_into $* + ;; +cgroups_tasks_move) + cgroups_tasks_move $* + ;; ftrace_get_function_stats) ftrace_get_function_stats ;; diff --git a/devlib/module/cgroups.py b/devlib/module/cgroups.py index 1d7a24a..a8fef73 100644 --- a/devlib/module/cgroups.py +++ b/devlib/module/cgroups.py @@ -275,3 +275,22 @@ class CgroupsModule(Module): return None return self.controllers[kind] + 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), + as_root=True) + + + def cgroups_tasks_move(self, srcg, dstg, exclude=''): + """ + Move all the tasks from the srcg CGroup to the dstg one. + A regexps of tasks names can be used to defined tasks which should not + be moved. + """ + return self.target._execute_util( + 'cgroups_tasks_move {} {} {}'.format(srcg, dstg, exclude), + as_root=True) +