Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 541792 | Differences between
and this patch

Collapse All | Expand All

(-)rc-cgroup.sh (-74 / +55 lines)
Lines 5-52 Link Here
5
5
6
cgroup_find_path()
6
cgroup_find_path()
7
{
7
{
8
	local OIFS n name dir result
8
	local ifs="$IFS" name dir DIR
9
	[ -n "$1" ] || return 0
9
	[ -n "$1" ] || return 0
10
	OIFS="$IFS"
11
	IFS=":"
10
	IFS=":"
12
	while read n name dir; do
11
	while read n name dir; do
13
		[ "$name" = "$1" ] && result="$dir"
12
		[ "$name" = "$1" ] && DIR="$dir"
14
	done < /proc/1/cgroup
13
	done < /proc/1/cgroup
15
	IFS="$OIFS"
14
	IFS="$ifs"
16
	echo $result
15
	echo "$DIR"
17
}
16
}
18
17
19
cgroup_get_pids()
18
cgroup_get_pids()
20
{
19
{
21
	local p
20
	local p
22
	pids=
21
	PIDS=
23
	while read p; do
22
	while read p; do
24
		[ $p -eq $$ ] || pids="${pids} ${p}"
23
		[ $p -eq $$ ] || PIDS="$PIDS $p"
25
	done < /sys/fs/cgroup/openrc/${RC_SVCNAME}/tasks
24
	done < /sys/fs/cgroup/openrc/$RC_SVCNAME/tasks
26
	[ -n "$pids" ]
25
	[ -n "$PIDS" ]
27
}
26
}
28
27
29
cgroup_running()
28
cgroup_get_state()
30
{
29
{
31
	[ -d "/sys/fs/cgroup/openrc/${RC_SVCNAME}" ]
30
	[ -d "/sys/fs/cgroup/openrc/$RC_SVCNAME" ]
32
}
31
}
33
32
34
cgroup_set_values()
33
cgroup_set_values()
35
{
34
{
36
	[ -n "$1" -a -n "$2" -a -d "/sys/fs/cgroup/$1" ] || return 0
35
	[ -n "$1" -a -n "$2" -a -d "/sys/fs/cgroup/$1" ] || return 0
37
36
38
	local controller="$1" h=$(cgroup_find_path "$1")
37
	local ctrl="$1" group head=$(cgroup_find_path "$1")
39
	cgroup="/sys/fs/cgroup/${1}${h}openrc_${RC_SVCNAME}"
38
	group="/sys/fs/cgroup/${1}${head}openrc_${RC_SVCNAME}"
40
	[ -d "$cgroup" ] || mkdir -p "$cgroup"
39
	[ -d "$group" ] || mkdir -p "$group"
41
40
42
	set -- $2
41
	set -- $2
43
	local name val
42
	local name val
44
	while [ -n "$1" -a "$controller" != "cpuacct" ]; do
43
	while [ -n "$1" -a "$ctrl" != "cpuacct" ]; do
45
		case "$1" in
44
		case "$1" in
46
			$controller.*)
45
			$ctrl.*)
47
				if [ -n "$name" -a -f "$cgroup/$name" -a -n "$val" ]; then
46
				if [ -n "$name" -a -f "$group/$name" -a -n "$val" ]; then
48
					veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val"
47
					veinfo "$RC_SVCNAME: Setting $group/$name to $val"
49
					echo $val > "$cgroup/$name"
48
					echo "$val" > "$group/$name"
50
				fi
49
				fi
51
				name=$1
50
				name=$1
52
				val=
51
				val=
Lines 57-134 Link Here
57
		esac
56
		esac
58
		shift
57
		shift
59
	done
58
	done
60
	if [ -n "$name" -a -f "$cgroup/$name" -a -n "$val" ]; then
59
	if [ -n "$name" -a -f "$group/$name" -a -n "$val" ]; then
61
		veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val"
60
		veinfo "$RC_SVCNAME: Setting $group/$name to $val"
62
		echo $val > "$cgroup/$name"
61
		echo "$val" > "$group/$name"
63
	fi
62
	fi
64
63
	if [ -f "$group/tasks" ]; then
65
	if [ -f "$cgroup/tasks" ]; then
64
		veinfo "$RC_SVCNAME: Adding to $group/tasks"
66
		veinfo "$RC_SVCNAME: adding to $cgroup/tasks"
65
		echo 0 > "$group/tasks"
67
		echo 0 > "$cgroup/tasks"
68
	fi
66
	fi
69
70
	return 0
67
	return 0
71
}
68
}
72
69
73
cgroup_add_service()
70
cgroup_add_service()
74
{
71
{
75
    # relocate starting process to the top of the cgroup
72
	# FIXME:
76
    # it prevents from unwanted inheriting of the user
73
	#  Relocating process to the top of the CGroup to prevent
77
    # cgroups. But may lead to a problems where that inheriting
74
	#  unwanted inheriting user CGroup may lead to issue when
78
    # is needed.
75
	#  inheriting may be necessary.
79
	for d in /sys/fs/cgroup/* ; do
76
	if yesno ${rc_cgroup_inherit:-${RC_CGROUP_INHERIT:-Yes}}; then
80
		[ -f "${d}"/tasks ] && echo 0 > "${d}"/tasks
77
		local dir
81
	done
78
		for dir in /sys/fs/cgroup/*; do
79
			[ -f "$dir"/tasks ] && echo $$ > "$dir"/tasks
80
		done
81
	fi
82
82
83
	openrc_cgroup=/sys/fs/cgroup/openrc
83
	local group cgroup=/sys/fs/cgroup/openrc
84
	if [ -d "$openrc_cgroup" ]; then
84
	if [ -d "$cgroup" ]; then
85
		cgroup="$openrc_cgroup/$RC_SVCNAME"
85
		group="$cgroup/$RC_SVCNAME"
86
		mkdir -p "$cgroup"
86
		mkdir -p "$group"
87
		[ -f "$cgroup/tasks" ] && echo $$ > "$cgroup/tasks"
87
		[ -f "$group/tasks" ] && echo $$ > "$group/tasks"
88
	fi
88
	fi
89
}
89
}
90
90
91
cgroup_set_limits()
91
cgroup_set_limits()
92
{
92
{
93
	local blkio="${rc_cgroup_blkio:-$RC_CGROUP_BLKIO}"
93
	local ctrl blkio cpu cpuacct cpuset devices memory net_prio
94
	[ -n "$blkio" ] && cgroup_set_values blkio "$blkio"
94
	for ctrl in blkio:BLKIO cpu:CPU cpuacct:CPUACCT cpuset:CPUSET \
95
95
		devices:DEVICES memory:MEMORY net_prio:NET_PRIO; do
96
	local cpu="${rc_cgroup_cpu:-$RC_CGROUP_CPU}"
96
		eval ${ctrl%:*}=\"\${rc_cgroup_${ctrl%:*}:-\${RC_CGROUP_${ctrl#*:}}}\"
97
	[ -n "$cpu" ] && cgroup_set_values cpu "$cpu"
97
		eval test -n \"\${${ctrl%:*}}\" && cgroup_set_values "${ctrl%:*}" "\${${ctrl%:*}}"
98
98
	done
99
	local cpuacct="${rc_cgroup_cpuacct:-$RC_CGROUP_CPUACCT}"
100
	[ -n "$cpuacct" ] && cgroup_set_values cpuacct "$cpuacct"
101
102
	local cpuset="${rc_cgroup_cpuset:-$RC_CGROUP_cpuset}"
103
	[ -n "$cpuset" ] && cgroup_set_values cpuset "$cpuset"
104
105
	local devices="${rc_cgroup_devices:-$RC_CGROUP_DEVICES}"
106
	[ -n "$devices" ] && cgroup_set_values devices "$devices"
107
108
	local memory="${rc_cgroup_memory:-$RC_CGROUP_MEMORY}"
109
	[ -n "$memory" ] && cgroup_set_values memory "$memory"
110
111
	local net_prio="${rc_cgroup_net_prio:-$RC_CGROUP_NET_PRIO}"
112
	[ -n "$net_prio" ] && cgroup_set_values net_prio "$net_prio"
113
114
	return 0
99
	return 0
115
}
100
}
116
101
117
cgroup_cleanup()
102
cgroup_cleanup()
118
{
103
{
119
	cgroup_running || return 0
104
	cgroup_get_state || return 0
120
	ebegin "starting cgroups cleanup"
105
	local CGROUP_GET_PIDS='cgroup_get_pids || { eend 0; return 0; };' SIG
121
	for sig in TERM QUIT INT; do
106
	ebegin "Cleaning up CGroups"
122
		cgroup_get_pids || { eend 0 "finished" ; return 0 ; }
107
	for SIG in TERM QUIT INT; do
123
		for i in 0 1; do
108
		eval $CGROUP_GET_PIDS
124
			kill -s $sig $pids
109
		kill -$SIG $PIDS
125
			for j in 0 1 2; do
126
				cgroup_get_pids || { eend 0 "finished" ; return 0 ; }
127
				sleep 1
128
			done
129
		done 2>/dev/null
130
	done
110
	done
131
	cgroup_get_pids || { eend 0 "finished" ; return 0; }
111
	eval $CGROUP_GET_PIDS
132
	kill -9 $pids
112
	kill -TERM $PIDS
133
	eend $(cgroup_running && echo 1 || echo 0) "fail to stop all processes"
113
	cgroup_get_state
114
	eend "$?" "Failed to stop all processes"
134
}
115
}

Return to bug 541792