From d8bbeb184f462199582fa265c9b681288884ecd9 Mon Sep 17 00:00:00 2001 From: William Hubbs Date: Sat, 19 Nov 2011 18:15:46 -0600 Subject: CGroups: create the openrc cgroup hierarchy Openrc will create a cgroup hierarchy called openrc which will have all services it starts and all subsystems attached to it. If you need other groups/hierarchies, please use libcgroup. --- etc/rc.conf.Linux | 7 ------- init.d/sysfs.in | 15 +++++++++++++-- sh/Makefile | 4 ++-- sh/cgroup-release-agent.sh.in | 10 ++++++++++ sh/runscript.sh.in | 23 +++++++++++++---------- 5 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 sh/cgroup-release-agent.sh.in diff --git a/etc/rc.conf.Linux b/etc/rc.conf.Linux index 963fc68..9b5859a 100644 --- a/etc/rc.conf.Linux +++ b/etc/rc.conf.Linux @@ -1,10 +1,3 @@ -# Set the control group for this service. -# If you do not set this, the default setting is the value of -# RC_SVCNAME. -# This setting is ignored if you do not have CONFIG_CGROUPS active in -# your kernel. -# rc_cgroup="foo" - ############################################################################## # LINUX SPECIFIC OPTIONS diff --git a/init.d/sysfs.in b/init.d/sysfs.in index a536d5f..d57c388 100644 --- a/init.d/sysfs.in +++ b/init.d/sysfs.in @@ -62,13 +62,24 @@ mount_misc() fi # Setup Kernel Support for cgroup - if [ -d /sys/fs/cgroup ] && ! mountinfo -q /sys/fs/cgroup; then - if grep -qs cgroup /proc/filesystems; then + if [ -d /sys/fs/cgroup ]; then + if grep -qs cgroup /proc/filesystems && \ + ! mountinfo -q /sys/fs/cgroup; then ebegin "Mounting cgroup filesystem" mount -n -t tmpfs -o nodev,noexec,nosuid \ cgroup /sys/fs/cgroup eend $? fi + if ! mountinfo -q /sys/fs/cgroup/openrc; then + ebegin "creating openrc control group" + mkdir /sys/fs/cgroup/openrc + mount -n -t cgroup -o nodev,noexec,nosuid \ + openrc /sys/fs/cgroup/openrc + echo 1 > /sys/fs/cgroup/openrc/notify_on_release + echo @LIBEXECDIR@/sh/cgroup-release-agent.sh \ + > /sys/fs/cgroup/openrc/release_agent + eend + fi fi } diff --git a/sh/Makefile b/sh/Makefile index f714780..15b24d0 100644 --- a/sh/Makefile +++ b/sh/Makefile @@ -12,8 +12,8 @@ include ${MK}/os.mk SRCS-FreeBSD= BIN-FreeBSD= -SRCS-Linux= init-early.sh.in udhcpc-hook.sh.in -BIN-Linux= init-early.sh udhcpc-hook.sh +SRCS-Linux= cgroup-release-agent.sh.in init-early.sh.in udhcpc-hook.sh.in +BIN-Linux= cgroup-release-agent.sh init-early.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/cgroup-release-agent.sh.in b/sh/cgroup-release-agent.sh.in new file mode 100644 index 0000000..c3174fe --- /dev/null +++ b/sh/cgroup-release-agent.sh.in @@ -0,0 +1,10 @@ +#!@SHELL@ +# +# This is run by the kernel after the last task is removed from a +# control group in the openrc hierarchy. + +cgroup=/sys/fs/cgroup/openrc +PATH=/bin:/usr/bin:/sbin:/usr/sbin +if [ -d ${cgroup}/$1 ]; then + rmdir ${cgroup}/$1 +fi diff --git a/sh/runscript.sh.in b/sh/runscript.sh.in index 706a1f7..4032cb8 100644 --- a/sh/runscript.sh.in +++ b/sh/runscript.sh.in @@ -148,6 +148,19 @@ start() service_inactive && _inactive=true mark_service_inactive fi + if [ "$RC_UNAME" = Linux ]; then + local cgroup=/sys/fs/cgroup/openrc + local svc_cgroup=${cgroup}/${RC_SVCNAME} + if mountinfo -q ${cgroup}; then + mkdir ${svc_cgroup} + for f in cpuset.cpus cpuset.mems; do + if [ -f ${cgroup}/${f} ]; then + cp ${cgroup}/${f} ${svc_cgroup} + fi + done + echo $$ > ${svc_cgroup}/tasks + fi + fi eval start-stop-daemon --start \ --exec $command \ ${procname:+--name} $procname \ @@ -189,16 +202,6 @@ fi # Load any system overrides sourcex -e "@SYSCONFDIR@/rc.conf" -# Attach to CGroup - dir existing is enough for us -if [ -d /sys/fs/cgroup -a -n "${rc_cgroup}" ]; then - if [ -d /sys/fs/cgroup/${rc_cgroup} ]; then - # attach self to cgroup - any children of this process will inherit this - echo $$ > /sys/fs/cgroup/${rc_cgroup}/tasks - else - eerror "Control group /sys/fs/cgroup/${rc_cgroup} does not exist." - fi -fi - # Apply any ulimit defined [ -n "${rc_ulimit:-$RC_ULIMIT}" ] && ulimit ${rc_ulimit:-$RC_ULIMIT} -- cgit v1.2.3