aboutsummaryrefslogtreecommitdiff
path: root/sh
diff options
context:
space:
mode:
Diffstat (limited to 'sh')
-rw-r--r--sh/.gitignore1
-rw-r--r--sh/Makefile4
-rw-r--r--sh/rc-cgroup.sh.in59
-rw-r--r--sh/runscript.sh.in26
4 files changed, 67 insertions, 23 deletions
diff --git a/sh/.gitignore b/sh/.gitignore
index a07afb3e..9fe55105 100644
--- a/sh/.gitignore
+++ b/sh/.gitignore
@@ -8,6 +8,7 @@ init.sh
init-early.sh
ifwatchd-carrier.sh
ifwatchd-nocarrier.sh
+rc-cgroup.sh
udhcpc-hook.sh
tmpfiles.sh
migrate-to-run.sh
diff --git a/sh/Makefile b/sh/Makefile
index 356c37e2..043b1448 100644
--- a/sh/Makefile
+++ b/sh/Makefile
@@ -13,9 +13,9 @@ SRCS-FreeBSD=
BIN-FreeBSD=
SRCS-Linux= cgroup-release-agent.sh.in init-early.sh.in migrate-to-run.sh.in \
- udhcpc-hook.sh.in
+ rc-cgroup.sh.in udhcpc-hook.sh.in
BIN-Linux= cgroup-release-agent.sh init-early.sh migrate-to-run.sh \
- udhcpc-hook.sh
+ rc-cgroup.sh udhcpc-hook.sh
SRCS-NetBSD= ifwatchd-carrier.sh.in ifwatchd-nocarrier.sh.in
BIN-NetBSD= ifwatchd-carrier.sh ifwatchd-nocarrier.sh
diff --git a/sh/rc-cgroup.sh.in b/sh/rc-cgroup.sh.in
new file mode 100644
index 00000000..09b9b564
--- /dev/null
+++ b/sh/rc-cgroup.sh.in
@@ -0,0 +1,59 @@
+#@SHELL@
+# Copyright (c) 2012 Alexander Vershilov <qnikst@gentoo.org>
+# Released under the 2-clause BSD license.
+
+cgroup_find_path()
+{
+ local OIFS n name dir result
+ [ -n "$1" ] || return 0
+ OIFS="$IFS"
+ IFS=":"
+ while read n name dir; do
+ [ "$name" = "$1" ] && result="$dir"
+ done < /proc/1/cgroup
+ IFS="$OIFS"
+ echo $result
+}
+
+# prepare values to be attached inside cgroups
+cgroup_prepare()
+{
+ local h=$(cgroup_find_path "$1")
+ cgroup="/sys/fs/cgroup/${1}${h}openrc_${RC_SVCNAME}"
+ [ -d ${cgroup} ] || mkdir -p ${cgroup}
+ return 0
+}
+
+cgroup_set_value()
+{
+ [ -f "$cgroup/${1}" -a -n "$2" ] && echo $2 > "${cgroup}/${1}"
+ return 0
+}
+
+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
+ fi
+
+ if [ -d /sys/fs/cgroup/cpu ]; then
+ local share
+
+ 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
+}
diff --git a/sh/runscript.sh.in b/sh/runscript.sh.in
index f953afb8..c9a37454 100644
--- a/sh/runscript.sh.in
+++ b/sh/runscript.sh.in
@@ -34,6 +34,7 @@ sourcex()
sourcex "@LIBEXECDIR@/sh/functions.sh"
sourcex "@LIBEXECDIR@/sh/rc-functions.sh"
+[ "$RC_SYS" != "PREFIX" ] && sourcex -e "@LIBEXECDIR@/sh/rc-cgroup.sh"
# Support LiveCD foo
if sourcex -e "/sbin/livecd-functions.sh"; then
@@ -204,30 +205,13 @@ unset _conf_d
# Load any system overrides
sourcex -e "@SYSCONFDIR@/rc.conf"
-if [ "$RC_UNAME" = "Linux" -a "$RC_SYS" != "PREFIX" -a "$1" = "start" ]; then
- 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
- fi
-
- shares="${rc_cgroup_cpu_shares:-$RC_CGROUP_CPU_SHARES}"
- if [ -n "${shares}" -a -d /sys/fs/cgroup/cpu ]; then
- cgroup=/sys/fs/cgroup/cpu/openrc_${RC_SVCNAME}
- if [ ! -d ${cgroup} ]; then
- mkdir -p ${cgroup}
- fi
- [ -f "${cgroup}"/cpu.shares ] && echo ${shares} > "${cgroup}"/cpu.shares
- [ -f "${cgroup}"/tasks ] && echo 0 >> "${cgroup}"/tasks
- fi
-
- #todo: add processes to cgroups based on settings in conf.d
-fi
-
# Apply any ulimit defined
[ -n "${rc_ulimit:-$RC_ULIMIT}" ] && ulimit ${rc_ulimit:-$RC_ULIMIT}
+# Apply cgroups settings if defined
+[ "$(command -v cgroup_set_limits)" = "cgroup_set_limits" ] && \
+ cgroup_set_limits
+
# Load our script
sourcex "$RC_SERVICE"