Author: arekm                        Date: Wed Mar 30 11:33:59 2011 GMT
Module: packages                      Tag: HEAD
---- Log message:
- rel 3; support for subdir per cgroup subsystem (default mount way used by 
libcgroup)

---- Files affected:
packages/util-vserver:
   util-vserver.spec (1.278 -> 1.279) , util-vserver-git.patch (NONE -> 1.1)  
(NEW)

---- Diffs:

================================================================
Index: packages/util-vserver/util-vserver.spec
diff -u packages/util-vserver/util-vserver.spec:1.278 
packages/util-vserver/util-vserver.spec:1.279
--- packages/util-vserver/util-vserver.spec:1.278       Mon Mar 28 18:48:06 2011
+++ packages/util-vserver/util-vserver.spec     Wed Mar 30 13:33:54 2011
@@ -20,7 +20,7 @@
 %endif
 
 %define                snap    pre2955
-%define                rel     1
+%define                rel     3
 Summary:       Linux virtual server utilities
 Summary(pl.UTF-8):     Narzędzia dla linuksowych serwerów wirtualnych
 Name:          util-vserver
@@ -74,6 +74,7 @@
 Patch22:       %{name}-pivot-root-ugly-hack.patch
 Patch24:       vunify-more-exclude.patch
 Patch25:       stat.patch
+Patch26:       %{name}-git.patch
 URL:           http://savannah.nongnu.org/projects/util-vserver/
 BuildRequires: autoconf
 BuildRequires: automake >= 1.9
@@ -403,6 +404,7 @@
 %patch22 -p1
 %patch24 -p1
 %patch25 -p1
+%patch26 -p1
 
 install %{SOURCE9} package-management.txt
 
@@ -947,6 +949,9 @@
 All persons listed below can be reached at <cvs_login>@pld-linux.org
 
 $Log$
+Revision 1.279  2011/03/30 11:33:54  arekm
+- rel 3; support for subdir per cgroup subsystem (default mount way used by 
libcgroup)
+
 Revision 1.278  2011/03/28 16:48:06  arekm
 - up to pre2955 (new debian wheezy); simplify util-vserver-pivot-root-ugly-hack
 

================================================================
Index: packages/util-vserver/util-vserver-git.patch
diff -u /dev/null packages/util-vserver/util-vserver-git.patch:1.1
--- /dev/null   Wed Mar 30 13:33:59 2011
+++ packages/util-vserver/util-vserver-git.patch        Wed Mar 30 13:33:54 2011
@@ -0,0 +1,369 @@
+diff --git a/doc/configuration.xml b/doc/configuration.xml
+index e03f92d..3e48568 100644
+--- a/doc/configuration.xml
++++ b/doc/configuration.xml
+@@ -317,12 +317,11 @@ configuration.
+ The directory to mount the cgroup hierarchy at. The default is /dev/cgroup.
+         </description>
+       </scalar>
+-      <scalar name="subsys">
++      <list name="subsys">
+         <description>
+-Comma-separated list of subsystems to enable on the cgroup mount point.
+-The default is "all".
++List of subsystems to enable on the cgroup mount point. The default is "all".
+         </description>
+-      </scalar>
++      </list>
+       <list name="inherit">
+         <description>
+ Some subsystems start out with clean slates, making it impossible to use the
+@@ -345,6 +344,11 @@ If this file exists, all cgroups will be created 
underneath this directory
+ in the cgroup mount point.
+         </description>
+       </scalar>
++      <boolean name="per-ss">
++        <description>
++If this file exists, each subsystem will have its own mount point.
++        </description>
++      </boolean>
+     </collection>
+   </collection>
+     
+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
+ }
+diff --git a/src/vserver-stat.c b/src/vserver-stat.c
+index 269edb0..e81c38d 100644
+--- a/src/vserver-stat.c
++++ b/src/vserver-stat.c
+@@ -309,13 +309,15 @@ registerXidCgroups(struct Vector *vec, struct 
process_info *process)
+     char                      vhi_name[65],
+                               filename[128],
+                               cgroup[129],
++                              name[129],
+                               buf[30];
+     int                               fd;
+-    ssize_t                   cgroup_len;
++    ssize_t                   cgroup_len, name_len;
+     unsigned long long                rss = 0;
+     char                      *endptr;
+     size_t                    len;
+     uint64_t                  stime_total, utime_total;
++    int                               per_ss = 0;
+ 
+ 
+     if (vc_virt_stat(xid, &vstat) == -1) {
+@@ -341,10 +343,14 @@ registerXidCgroups(struct Vector *vec, struct 
process_info *process)
+         perror("read(cgroup/mnt)");
+         return;
+       }
+-      close(fd);
+-      cgroup[cgroup_len] = '/';
+-      cgroup_len += 1;
+-      cgroup[cgroup_len] = 0;
++      if (cgroup_len > 0) {
++      close(fd);
++      while (cgroup[cgroup_len - 1] == '\n' || cgroup[cgroup_len - 1] == '\r')
++        cgroup_len--;
++      cgroup[cgroup_len] = '/';
++      cgroup_len += 1;
++      cgroup[cgroup_len] = 0;
++      }
+     }
+ 
+     if ((fd = open(DEFAULTCONFDIR "/cgroup/base", O_RDONLY)) != -1) {
+@@ -354,14 +360,21 @@ registerXidCgroups(struct Vector *vec, struct 
process_info *process)
+         return;
+       }
+       close(fd);
+-      cgroup_len += len;
+-      if (cgroup[cgroup_len - 1] != '/') {
+-        cgroup[cgroup_len] = '/';
+-        cgroup_len += 1;
++      if (len > 0) {
++      while (cgroup[cgroup_len + len - 1] == '\n' || cgroup[cgroup_len + len 
- 1] == '\r')
++        len--;
++      cgroup_len += len;
++      if (cgroup[cgroup_len - 1] != '/') {
++        cgroup[cgroup_len] = '/';
++        cgroup_len += 1;
++      }
++      cgroup[cgroup_len] = 0;
+       }
+-      cgroup[cgroup_len] = 0;
+     }
+ 
++    if (access(DEFAULTCONFDIR "/cgroup/per-ss", F_OK) == 0)
++      per_ss = 1;
++
+     len = strlen(vhi_name);
+     if ((len + sizeof("/cgroup/name")) >= sizeof(filename)) {
+       WRITE_MSG(2, "too long context name: ");
+@@ -380,35 +393,36 @@ registerXidCgroups(struct Vector *vec, struct 
process_info *process)
+         WRITE_MSG(2, "\n");
+         return;
+       }
+-      len = strlen(dir);
+-      if ((len + cgroup_len) >= sizeof(cgroup)) {
++      name_len = strlen(dir);
++      if (name_len >= sizeof(name)) {
+         WRITE_MSG(2, "cgroup name too long: ");
+         WRITE_STR(2, dir);
+         WRITE_MSG(2, "\n");
+         return;
+       }
+-      strcpy(cgroup + cgroup_len, dir);
+-      cgroup_len += len;
++      strcpy(name, dir);
+     }
+     else {
+-      ssize_t ret;
+-      ret = read(fd, cgroup + cgroup_len, sizeof(cgroup) - cgroup_len);
+-      if (ret == -1) {
++      name_len = read(fd, name, sizeof(name));
++      if (name_len == -1) {
+         perror("read(cgroup/name)");
+         return;
+       }
+-      cgroup_len += ret;
++      if (name_len > 0) {
++      while (name[name_len - 1] == '\n' || name[name_len - 1] == '\r')
++        name_len--;
++      name[name_len] = '\0';
++      }
+       close(fd);
+     }
+ 
+-    if ((cgroup_len + sizeof("/memory.usage_in_bytes")) > sizeof(filename)) {
++    if ((cgroup_len + name_len + sizeof("/memory/memory.usage_in_bytes")) > 
sizeof(filename)) {
+       WRITE_MSG(2, "cgroup name too long: ");
+       WRITE_STR(2, cgroup);
+       WRITE_MSG(2, "\n");
+       return;
+     }
+-    strcpy(filename, cgroup);
+-    strcpy(filename + cgroup_len, "/memory.usage_in_bytes");
++    snprintf(filename, sizeof(filename), "%s%s%s/memory.usage_in_bytes", 
cgroup, (per_ss ? "/memory" : ""), name);
+ 
+     if ((fd = open(filename, O_RDONLY)) == -1)
+       perror("open(memory.usage_in_bytes)");
+@@ -425,8 +439,7 @@ registerXidCgroups(struct Vector *vec, struct process_info 
*process)
+       }
+     }
+ 
+-    strcpy(filename, cgroup);
+-    strcpy(filename + cgroup_len, "/cpuacct.stat");
++    snprintf(filename, sizeof(filename), "%s%s%s/cpuacct.stat", cgroup, 
(per_ss ? "/cpuacct" : ""), name);
+ 
+     if ((fd = open(filename, O_RDONLY)) == -1) {
+       utime_total     = 0;
+diff --git a/sysv/util-vserver b/sysv/util-vserver
+index 0f5dd6c..8cc173f 100755
+--- a/sysv/util-vserver
++++ b/sysv/util-vserver
+@@ -67,14 +67,31 @@ function mount_cgroup()
+     _generateCgroupOptions
+     test -n "$CGROUP_MNT" || return 0
+     $_MKDIR -p "$CGROUP_MNT"
+-    $_MOUNT -t cgroup -o "$CGROUP_SUBSYS" vserver "$CGROUP_MNT"
++    if test -n "$CGROUP_MNT_PER_SS"; then
++      for ss in "${CGROUP_SUBSYS[@]}"; do
++          $_MKDIR -p "$CGROUP_MNT/$ss"
++          $_MOUNT -t cgroup -o "$ss" vserver "$CGROUP_MNT/$ss"
++      done
++    else
++      oIFS="$IFS"
++      IFS=,
++      ss="${CGROUP_SUBSYS[*]}"
++      IFS="$oIFS"
++      $_MOUNT -t cgroup -o "$ss" vserver "$CGROUP_MNT"
++    fi
+ }
+ 
+ function umount_cgroup()
+ {
+     _generateCgroupOptions
+     test -n "$CGROUP_MNT" || return 0
+-    $_UMOUNT "$CGROUP_MNT"
++    if test -n "$CGROUP_MNT_PER_SS"; then
++      for ss in "${CGROUP_SUBSYS[@]}"; do
++          $_UMOUNT "$CGROUP_MNT/$ss"
++      done
++    else
++      $_UMOUNT "$CGROUP_MNT"
++    fi
+ }
+ 
+ function start()
================================================================

---- CVS-web:
    
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/util-vserver/util-vserver.spec?r1=1.278&r2=1.279&f=u

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to