From 5ccec170d93ce667be3674b4851e3efdeb0d9dc2 Mon Sep 17 00:00:00 2001 From: Mats Karrman Date: Wed, 20 Apr 2016 16:55:00 +0200 Subject: [PATCH] Add new package libcgroup --- libcgroup/Makefile | 105 ++++++++++++++++++++++++++++ libcgroup/files/cgroups.config | 40 +++++++++++ libcgroup/files/cgroups.init | 123 +++++++++++++++++++++++++++++++++ 3 files changed, 268 insertions(+) create mode 100644 libcgroup/Makefile create mode 100644 libcgroup/files/cgroups.config create mode 100755 libcgroup/files/cgroups.init diff --git a/libcgroup/Makefile b/libcgroup/Makefile new file mode 100644 index 000000000..0dfff375e --- /dev/null +++ b/libcgroup/Makefile @@ -0,0 +1,105 @@ +# +# Copyright (C) 2016 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=libcgroup +PKG_VERSION:=0.41 +PKG_RELEASE:=1 + +PKG_LICENSE:=LGPL-2.1 +PKG_LICENSE_FILES:=COPYING + +PKG_SOURCE_VERSION:=2186c97f60df7efe86ddadd5e3d9d36dd4923b98 + +PKG_SOURCE_URL:=git://git.code.sf.net/p/libcg/libcg +PKG_SOURCE_PROTO:=git +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)+git$(PKG_SOURCE_VERSION).tar.gz +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) + +#PKG_BUILD_PARALLEL:=1 +PKG_FIXUP:=autoreconf + +# run install target when cross compiling. basically, make install DESTDIR=$(PKG_INSTALL_DIR) +# this way we don't need to pick out the resulting files from the build dir. +PKG_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/libcgroup + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:=+libpthread + TITLE:=Control group configuration library + URL:=https://sourceforge.net/p/libcg/ +endef + +define Package/libcgroup/description + Control groups, a new kernel feature in Linux 2.6.24 provides a file system + interface to manipulate and control the details on task grouping including + creation of new task groups (control groups), permission handling and task + assignment. +endef + +define Package/libcgroup-daemon + SECTION:=base + CATEGORY:=Base system + DEPENDS:=+libcgroup + TITLE:=Control group management daemon + URL:=https://sourceforge.net/p/libcg/ +endef + +define Package/libcgroup-utils + SECTION:=utils + CATEGORY:=Utilities + DEPENDS:=+libcgroup + TITLE:=Control group configuration utilities + URL:=https://sourceforge.net/p/libcg/ +endef + +#define Package/libcgroup/conffiles +# /etc/config/cgroups +#endef + +CONFIGURE_ARGS += \ + --disable-bindings \ + --disable-pam \ + --enable-static \ + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include/libcgroup + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/ + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/libcgroup/*.h $(1)/usr/include/libcgroup/ + + $(INSTALL_DIR) $(1)/usr/lib $(1)/usr/lib/pkgconfig + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libcgroup.* $(1)/usr/lib/ + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libcgroup.pc $(1)/usr/lib/pkgconfig/ +endef + +define Package/libcgroup/install + $(INSTALL_DIR) $(1)/usr/lib + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libcgroup.so* $(1)/usr/lib/ +endef + +define Package/libcgroup-daemon/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/* $(1)/usr/sbin + + # move to its own package? + $(INSTALL_DIR) $(1)/etc/config $(1)/etc/init.d + $(INSTALL_CONF) ./files/cgroups.config $(1)/etc/config/cgroups + $(INSTALL_BIN) ./files/cgroups.init $(1)/etc/init.d/cgroups +endef + +define Package/libcgroup-utils/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin +endef + +$(eval $(call BuildPackage,libcgroup)) +$(eval $(call BuildPackage,libcgroup-daemon)) +$(eval $(call BuildPackage,libcgroup-utils)) diff --git a/libcgroup/files/cgroups.config b/libcgroup/files/cgroups.config new file mode 100644 index 000000000..896f32a26 --- /dev/null +++ b/libcgroup/files/cgroups.config @@ -0,0 +1,40 @@ +config cgroups cgroups + option enabled 1 + option defgroup iopsys/normal + +config cgroup _root_ + list option memory.move_charge_at_immigrate=1 + +config cgroup iopsys + list option cpu.shares=4096 + list option memory.limit_in_bytes=-1 + list option memory.move_charge_at_immigrate=1 + +config cgroup iopsys_normal + list option cpu.shares=1024 + list option memory.limit_in_bytes=-1 + list option memory.move_charge_at_immigrate=1 + +config cgroup iopsys_high + list option cpu.shares=4096 + list option memory.limit_in_bytes=-1 + list option memory.move_charge_at_immigrate=1 + +config cgroup 3prt + list option cpu.shares=1024 + list option memory.limit_in_bytes=75M + list option memory.move_charge_at_immigrate=1 + +config cgroup 3prt_normal + list option cpu.shares=1024 + list option memory.limit_in_bytes=75M + list option memory.move_charge_at_immigrate=1 + +config cgroup 3prt_high + list option cpu.shares=4096 + list option memory.limit_in_bytes=75M + list option memory.move_charge_at_immigrate=1 + +config procmap procmap + list procmap minidlna=3prt/normal + diff --git a/libcgroup/files/cgroups.init b/libcgroup/files/cgroups.init new file mode 100755 index 000000000..283b00977 --- /dev/null +++ b/libcgroup/files/cgroups.init @@ -0,0 +1,123 @@ +#!/bin/sh /etc/rc.common + +START=01 +USE_PROCD=1 +#PROCD_DEBUG=1 +NAME=cgrulesengd + +CGBASEDIR=/sys/fs/cgroup +CGCONFIG="cgroups" + +CGRULESCONF=/tmp/cgrules.conf +CGCONFIGCONF=/tmp/cgconfig.conf + + +cgroupinit_add_knob_val_to_list () { +CG_KNOB_VAL_LIST="$CG_KNOB_VAL_LIST +$1" +} + +cgroupinit_create_group () { + local cgrp=$1 + local dir curr + + if [ "$cgrp" == "_root_" ]; then + dir=. + else + dir=$(echo $cgrp |tr '_' '/') + fi + + echo -e "group $dir {" >> $CGCONFIGCONF + + CG_KNOB_VAL_LIST= + config_list_foreach $cgrp option cgroupinit_add_knob_val_to_list + CG_KNOB_VAL_LIST=$(echo "$CG_KNOB_VAL_LIST" |sort) + curr="_none_" + + for knob_val in $CG_KNOB_VAL_LIST ; do + local ctrlr knob val + + knob=$(echo $knob_val |awk -F= '{print $1}') + ctrlr=$(echo $knob |awk -F. '{print $1}') + val=$(echo $knob_val |awk -F= '{print $2}') + + if [ "$curr" != "$ctrlr" ]; then + [ "$curr" == "_none_" ] || echo -e "\t}" >> $CGCONFIGCONF + curr=$ctrlr + echo -e "\t$curr {" >> $CGCONFIGCONF + fi + + echo -e "\t\t$knob = \"$val\";" >> $CGCONFIGCONF + done + + [ "$curr" == "_none_" ] || echo -e "\t}" >> $CGCONFIGCONF + echo -e "}\n" >> $CGCONFIGCONF +} + +cgroupinit_add_to_rules () { + local name_grp=$1 + local name grp + + name=$(echo $name_grp |awk -F= '{print $1}') + grp=$(echo $name_grp |awk -F= '{print $2}') + + echo -e "*:$name\t*\t$grp" >> $CGRULESCONF +} + +cgroupinit_generate_config () { + local enab defgrp + + config_load $CGCONFIG + + config_get enab cgroups enabled "1" + [ $enab -eq 0 ] && return 1 + + config_get defgrp cgroups defgroup "_undef_" + [ "$defgrp" == "_undef_" ] && return 1 + + # mount here instead of in cgconfigparser to get all options right + # mounting without any controllers listed means mount all available + if ! grep -q " $CGBASEDIR cgroup " /proc/mounts; then + mount -t cgroup -o nodev,noexec,nosuid cgroup $CGBASEDIR + [ $? -eq 0 ] || return 1 + fi + + echo -n '' > $CGCONFIGCONF + config_foreach cgroupinit_create_group cgroup + + echo -n '' > $CGRULESCONF + config_list_foreach procmap procmap cgroupinit_add_to_rules + echo -e "*\t*\t$defgrp" >> $CGRULESCONF + + return 0 +} + +# cgrulesengd has hardcoded paths for configuration files +# use symlinks to point to generated config files +cgroupinit_cgrulesengd_fixup () { + [ -r /etc/cgrules.conf ] || ln -s $CGRULESCONF /etc/cgrules.conf + [ -r /etc/cgconfig.conf ] || ln -s $CGCONFIGCONF /etc/cgconfig.conf + [ -d /etc/cgconfig.d ] || mkdir /etc/cgconfig.d +} + +start_service () { + cgroupinit_generate_config + [ $? -eq 0 ] || return + + cgroupinit_cgrulesengd_fixup + /usr/sbin/cgconfigparser -l $CGCONFIGCONF || return + + procd_open_instance + procd_set_param command /usr/sbin/cgrulesengd --nodaemon --syslog + procd_set_param respawn + procd_close_instance +} + +stop_service () { + /usr/sbin/cgclear +} + +service_triggers() { + procd_add_reload_trigger $CGCONFIG +} +