summaryrefslogtreecommitdiff
path: root/sh
diff options
context:
space:
mode:
authorWilliam Hubbs <w.d.hubbs@gmail.com>2013-02-17 15:14:06 -0600
committerWilliam Hubbs <w.d.hubbs@gmail.com>2013-02-19 17:09:30 -0600
commitfac96b4df4b61db399bfa18549be162e9861b0b5 (patch)
treeb6469bbad6cfa12682c5fc3abe2265a644fae071 /sh
parentebf85d598e6ad2628e5d472ceeda3f86b2f0eac1 (diff)
downloadopenrc-fac96b4df4b61db399bfa18549be162e9861b0b5.tar.gz
openrc-fac96b4df4b61db399bfa18549be162e9861b0b5.tar.bz2
openrc-fac96b4df4b61db399bfa18549be162e9861b0b5.tar.xz
cgroups: major update to cgroups support
This reworks cgroups support so we have one variable in rc.conf for each controller instead of each setting. Also we add support for all of the possible cgroup controllers. I would like to thank Alexander Vershilov for his help with testing and reworking this code.
Diffstat (limited to 'sh')
-rw-r--r--sh/rc-cgroup.sh.in83
1 files changed, 56 insertions, 27 deletions
diff --git a/sh/rc-cgroup.sh.in b/sh/rc-cgroup.sh.in
index c9a0062..449c1d3 100644
--- a/sh/rc-cgroup.sh.in
+++ b/sh/rc-cgroup.sh.in
@@ -15,45 +15,74 @@ cgroup_find_path()
echo $result
}
-# prepare values to be attached inside cgroups
-cgroup_prepare()
+cgroup_set_values()
{
- local h=$(cgroup_find_path "$1")
+ [ -n "$1" -a -n "$2" -a -d "/sys/fs/cgroup/$1" ] || return 0
+
+ local controller="$1" h=$(cgroup_find_path "$1")
cgroup="/sys/fs/cgroup/${1}${h}openrc_${RC_SVCNAME}"
- [ -d ${cgroup} ] || mkdir -p ${cgroup}
- return 0
-}
+ [ -d "$cgroup" ] || mkdir -p "$cgroup"
-cgroup_set_value()
-{
- [ -f "$cgroup/${1}" -a -n "$2" ] && echo $2 > "${cgroup}/${1}"
- return 0
-}
+ set -- $2
+ local name val
+ while [ -n "$1" -a "$controller" != "cpuacct" ]; do
+ case "$1" in
+ $controller.*)
+ if [ -n "$name" -a -f "$cgroup/$name" -a -n "$val" ]; then
+ veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val"
+ echo $val > "$cgroup/$name"
+ fi
+ name=$1
+ val=
+ ;;
+ *)
+ val="$val $1"
+ ;;
+ esac
+ shift
+ done
+ if [ -n "$name" -a -f "$cgroup/$name" -a -n "$val" ]; then
+ veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val"
+ echo $val > "$cgroup/$name"
+ fi
+
+ if [ -f "$cgroup/tasks" ]; then
+ veinfo "$RC_SVCNAME: adding to $cgroup/tasks"
+ echo 0 > "$cgroup/tasks"
+ fi
-cgroup_add_process()
-{
- [ -f "${cgroup}"/tasks ] && echo 0 > "${cgroup}"/tasks
return 0
}
cgroup_set_limits()
{
openrc_cgroup=/sys/fs/cgroup/openrc
- if [ -d ${openrc_cgroup} ]; then
- cgroup=${openrc_cgroup}/${RC_SVCNAME}
- mkdir -p ${cgroup}
- [ -f "${cgroup}"/tasks ] && echo 0 > "${cgroup}"/tasks
+ if [ -d "$openrc_cgroup" ]; then
+ cgroup="$openrc_cgroup/$RC_SVCNAME"
+ mkdir -p "$cgroup"
+ [ -f "$cgroup/tasks" ] && echo 0 > "$cgroup/tasks"
fi
- if [ -d /sys/fs/cgroup/cpu ]; then
- local share
+ local blkio="${rc_cgroup_blkio:-$RC_CGROUP_BLKIO}"
+ [ -n "$blkio" ] && cgroup_set_values blkio "$blkio"
+
+ local cpu="${rc_cgroup_cpu:-$RC_CGROUP_CPU}"
+ [ -n "$cpu" ] && cgroup_set_values cpu "$cpu"
+
+ local cpuacct="${rc_cgroup_cpuacct:-$RC_CGROUP_CPUACCT}"
+ [ -n "$cpuacct" ] && cgroup_set_values cpuacct "$cpuacct"
+
+ local cpuset="${rc_cgroup_cpuset:-$RC_CGROUP_cpuset}"
+ [ -n "$cpuset" ] && cgroup_set_values cpuset "$cpuset"
+
+ local devices="${rc_cgroup_devices:-$RC_CGROUP_DEVICES}"
+ [ -n "$devices" ] && cgroup_set_values devices "$devices"
+
+ local memory="${rc_cgroup_memory:-$RC_CGROUP_MEMORY}"
+ [ -n "$memory" ] && cgroup_set_values memory "$memory"
+
+ local net_prio="${rc_cgroup_net_prio:-$RC_CGROUP_NET_PRIO}"
+ [ -n "$net_prio" ] && cgroup_set_values net_prio "$net_prio"
- share=${rc_cgroup_cpu_shares:-$RC_CGROUP_CPU_SHARES}
- if [ -n "$share" ]; then
- cgroup_prepare "cpu"
- cgroup_set_value "cpu.shares" $share
- cgroup_add_process
- fi
- fi
return 0
}