X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=scripts%2Fvserver.functions;h=d35a4fe7350a3049cb81a3d40b464aeda800a304;hb=73344887cd41fa1157c86ae3e1ad75e007e6e0d8;hp=5381d82baf3bc6ae93b6f9a99f3c5e9a3b3f4451;hpb=38d5f3551ce73e6b1d45fe219fa7951e788b20fd;p=util-vserver.git diff --git a/scripts/vserver.functions b/scripts/vserver.functions index 5381d82..d35a4fe 100644 --- a/scripts/vserver.functions +++ b/scripts/vserver.functions @@ -75,9 +75,10 @@ N_CONTEXT= SILENT_OPT= CGROUP_MNT=/dev/cgroup -CGROUP_SUBSYS=all +declare -a CGROUP_SUBSYS=() declare -a CGROUP_INHERIT=( cpuset.cpus cpuset.mems ) CGROUP_BASE="" +CGROUP_MNT_PER_SS="" : ${VSERVER_NAME:=$(basename "$VSERVER_DIR")} @@ -1458,11 +1459,9 @@ function _generateCgroupOptions fi findFile file "$__CONFDIR/.defaults/cgroup/subsys" "" if test -n "$file"; then - read CGROUP_SUBSYS < "$file" - elif $_GREP -q '^ns[[:space:]]' /proc/cgroups; then - # Hack for the ns subsystem, with which we are incompatible - CGROUP_SUBSYS=$($_SED '/^#/d;/^ns[[:space:]]/d;s/[[:space:]].*//' /proc/cgroups | \ - (s=""; while read x; do test -n "$s" && s="$s,"; s="$s$x"; done; echo "$s")) + _readFileToArray CGROUP_SUBSYS "$file" + else + CGROUP_SUBSYS=( $($_SED '/^#/d;/^ns[[:space:]]/d;s/[[:space:]].*//' /proc/cgroups) ) fi findFile file "$__CONFDIR/.defaults/cgroup/inherit" "" if test -n "$file"; then @@ -1474,6 +1473,10 @@ function _generateCgroupOptions test "$CGROUP_BASE" != "${CGROUP_BASE%/}" || \ CGROUP_BASE="${CGROUP_BASE}/" fi + findFile file "$__CONFDIR/.defaults/cgroup/per-ss" "" + if test -n "$file"; then + CGROUP_MNT_PER_SS=1 + fi return 0 } @@ -1481,8 +1484,19 @@ function _generateCgroupOptions function useCgroup { hasCgroup || return 1 - test -d "$CGROUP_MNT" || return 1 - memcg="" + if test -n "$CGROUP_MNT_PER_SS"; then + local existing=0 + local ss + for ss in "${CGROUP_SUBSYS[@]}"; do + if test -e "$CGROUP_MNT/$ss/tasks"; then + let existing=${existing}+1 + fi + done + test "$existing" -gt 0 || return 1 + else + test -e "$CGROUP_MNT/tasks" || return 1 + fi + local memcg="" if $_VSERVER_INFO - FEATURE memcg; then memcg=1 fi @@ -1500,6 +1514,8 @@ function _handleCgroup local i local j local parent + local -a mnts + local ss useCgroup "$vdir" || return 0 @@ -1511,47 +1527,63 @@ function _handleCgroup name="$VSERVER_NAME" fi - if test "$action" = "attach"; then - 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" + if test -n "$CGROUP_MNT_PER_SS"; then + mnts=() + for ss in "${CGROUP_SUBSYS[@]}"; do + mnts=( "${mnts[@]}" "$CGROUP_MNT/$ss" ) + done + else + mnts=( "$CGROUP_MNT" ) + fi + for mnt in "${mnts[@]}"; do + test -d "$mnt" || continue + if test "$action" = "attach"; then + if test -n "$CGROUP_BASE"; then + local -a dirs=() + i="$mnt/$CGROUP_BASE" + while test "$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 "$mnt/$CGROUP_BASE$name" 2>/dev/null; then + parent="$mnt/$CGROUP_BASE$name" + parent="${parent%/*}" + for i in "${CGROUP_INHERIT[@]}"; do + test -f "$parent/$i" || continue + cat "$parent/$i" > "$mnt/$CGROUP_BASE$name/$i" + done + + if test -n "$dir"; then + shopt -s nullglob + for i in "$dir"/*; do + f="${i##*/}" + test "$f" != mnt -a "$f" != subsys -a \ + "$f" != inherit -a "$f" != name -a "$f" != base -a \ + "$f" != per-ss \ + || continue + if test -n "$CGROUP_MNT_PER_SS"; then + ss="${f%%.*}" + test "$ss" = "${mnt##*/}" || continue + fi + cat "$i" > "$mnt/$CGROUP_BASE$name/$f" 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/$CGROUP_BASE$name/$i" - done - - if test -n "$dir"; then - shopt -s nullglob - for i in "$dir"/*; do - f="${i##*/}" - test "$f" != mnt -a "$f" != subsys -a \ - "$f" != inherit -a "$f" != name -a "$f" != base \ - || continue - cat "$i" > "$CGROUP_MNT/$CGROUP_BASE$name/$f" - done fi + echo "$$" > "$mnt/$CGROUP_BASE$name/tasks" + elif test "$action" = "destroy"; then + rmdir "$mnt/$name" 2>/dev/null || : fi - echo "$$" > "$CGROUP_MNT/$CGROUP_BASE$name/tasks" - elif test "$action" = "destroy"; then - rmdir "$CGROUP_MNT/$name" 2>/dev/null || : - fi + done return 0 }