From: Daniel Hokka Zakrisson Date: Wed, 16 Mar 2011 11:34:51 +0000 (+0100) Subject: Support a base cgroup. X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?p=util-vserver.git;a=commitdiff_plain;h=e43cea82e4ad142e96689656d952d7f3c2f8c68b Support a base cgroup. --- diff --git a/scripts/vserver.functions b/scripts/vserver.functions index 228c70b..1dc880a 100644 --- a/scripts/vserver.functions +++ b/scripts/vserver.functions @@ -77,6 +77,7 @@ SILENT_OPT= CGROUP_MNT=/dev/cgroup CGROUP_SUBSYS=all declare -a CGROUP_INHERIT=( cpuset.cpus cpuset.mems ) +CGROUP_BASE="" : ${VSERVER_NAME:=$(basename "$VSERVER_DIR")} @@ -1467,6 +1468,12 @@ function _generateCgroupOptions if test -n "$file"; then _readFileToArray CGROUP_INHERIT "$file" "" fi + findFile file "$__CONFDIR/.defaults/cgroup/base" "" + if test -n "$file"; then + read CGROUP_BASE < "$file" + test "$CGROUP_BASE" != "${CGROUP_BASE%/}" || \ + CGROUP_BASE="${CGROUP_BASE}/" + fi return 0 } @@ -1491,6 +1498,7 @@ function _handleCgroup local dir local name local i + local j local parent useCgroup "$vdir" || return 0 @@ -1504,12 +1512,29 @@ function _handleCgroup fi if test "$action" = "attach"; then - if mkdir "$CGROUP_MNT/$name" 2>/dev/null; then - parent="$CGROUP_MNT/$name" + if test -n "$CGROUP_BASE"; then + local -a dirs=() + i="$CGROUP_MNT/$CGROUP_BASE" + while test "$CGROUP_MNT" != "$i"; do + dirs=( "$i" "${dirs[@]}" ) + i="${i%/*}" + done + for i in "${dirs[@]}"; do + if mkdir "$i" 2>/dev/null; then + parent="${i%/*}" + for j in "${CGROUP_INHERIT[@]}"; do + test -f "$parent/$j" || continue + cat "$parent/$j" > "$i/$j" + done + fi + done + fi + if mkdir "$CGROUP_MNT/$CGROUP_BASE$name" 2>/dev/null; then + parent="$CGROUP_MNT/$CGROUP_BASE$name" parent="${parent%/*}" for i in "${CGROUP_INHERIT[@]}"; do test -f "$parent/$i" || continue - cat "$parent/$i" > "$CGROUP_MNT/$name/$i" + cat "$parent/$i" > "$CGROUP_MNT/$CGROUP_BASE$name/$i" done if test -n "$dir"; then @@ -1518,11 +1543,11 @@ function _handleCgroup f="${i##*/}" test "$f" != mnt -a "$f" != subsys -a \ "$f" != inherit -a "$f" != name || continue - cat "$i" > "$CGROUP_MNT/$name/$f" + cat "$i" > "$CGROUP_MNT/$CGROUP_BASE$name/$f" done fi fi - echo "$$" > "$CGROUP_MNT/$name/tasks" + echo "$$" > "$CGROUP_MNT/$CGROUP_BASE$name/tasks" elif test "$action" = "destroy"; then rmdir "$CGROUP_MNT/$name" 2>/dev/null || : fi