blob: ddde940cbe22ad46f2148d2719e8f36ea42c4af5 [file] [log] [blame] [edit]
# Copyright 2012 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
description "mount cgroups on /sys/fs/cgroup"
author "chromium-os-dev@chromium.org"
# Disable OOM killer as we must never fail.
oom score never
start on starting boot-services
task
# To be compatible with how Android container mounts cpusets, we mount
# without prefix (so "cpuset.cpus" turns into "cpus").
# However, some platforms (like LXC containers on moblab) need the prefix.
# So let platforms override as needed.
env CPUSET_NOPREFIX=true
script
log() {
logger -t "${UPSTART_JOB}" "failed to mount cgroup susbsystem $1"
}
default_mount_opts="noexec,nosuid,nodev"
for subsys in cpu freezer devices cpuacct cpuset memory net_cls; do
# Verify that the subsystem is available on our kernel.
grep -q ${subsys} /proc/cgroups || continue
mkdir -p /sys/fs/cgroup/${subsys} # croslint: disable
mount_opts="${default_mount_opts}"
if [ "${subsys}" = "cpuset" ] && [ "${CPUSET_NOPREFIX}" = true ]; then
mount_opts="${mount_opts},noprefix"
fi
# Mount cpuset cgroup controllers.
if [ "${subsys}" = "cpuset" ]; then
# First try v2 mode, avoids need for cpuset hotplug on kernel >= 4.14.
if ! mount -t cgroup cgroup "/sys/fs/cgroup/${subsys}" \
-o "${subsys},${mount_opts},cpuset_v2_mode"; then
# If failed try regular cpuset, kernel < 4.14 needs hotplug fixes.
mount -t cgroup cgroup "/sys/fs/cgroup/${subsys}" \
-o "${subsys},${mount_opts}" || log "${subsys}"
fi
else
# Mount non-cpuset cgroup controllers.
mount -t cgroup cgroup "/sys/fs/cgroup/${subsys}" \
-o "${subsys},${mount_opts}" || log "${subsys}"
fi
if [ "${subsys}" != "net_cls" ]; then
mkdir -p /sys/fs/cgroup/${subsys}/session_manager_containers \
# croslint: disable
if id -u android-root 2>/dev/null; then
chown android-root:android-root \
/sys/fs/cgroup/${subsys}/session_manager_containers \
# croslint: disable
fi
if id -u user-containers 2>/dev/null; then
mkdir -p /sys/fs/cgroup/${subsys}/user_containers # croslint: disable
chown user-containers:user-containers \
/sys/fs/cgroup/${subsys}/user_containers # croslint: disable
if [ "${subsys}" = "freezer" ]; then
chown power:power \
/sys/fs/cgroup/freezer/user_containers/freezer.state \
# croslint: disable
fi
fi
mkdir -p /sys/fs/cgroup/${subsys}/chronos_containers # croslint: disable
chown chronos:chronos /sys/fs/cgroup/${subsys}/chronos_containers \
# croslint: disable
fi
# powerd needs to be able to freeze each child of the root freezer, so give
# it ownership of the freezer.state file (and only that file).
if [ "${subsys}" = "freezer" ]; then
chown power:power \
/sys/fs/cgroup/${subsys}/session_manager_containers/freezer.state \
# croslint: disable
chown power:power \
/sys/fs/cgroup/${subsys}/chronos_containers/freezer.state \
# croslint: disable
fi
done
# Create and set up Chrome cpusets with default settings
# (all cpus, all mems).
cpuset_root_dir="/sys/fs/cgroup/cpuset"
if [ -d "${cpuset_root_dir}" ]; then
cpuset_root_cpus=$(cat "${cpuset_root_dir}/cpus")
cpuset_root_mems=$(cat "${cpuset_root_dir}/mems")
for cset in chrome chrome/urgent chrome/non-urgent; do
cset_dir="${cpuset_root_dir}/${cset}"
mkdir -p "${cset_dir}" # croslint: disable
chown chronos:chronos "${cset_dir}/cgroup.procs" # croslint: disable
chown chronos:chronos "${cset_dir}/tasks" # croslint: disable
echo "${cpuset_root_cpus}" > "${cset_dir}/cpus"
echo "${cpuset_root_mems}" > "${cset_dir}/mems"
done
for cset in user_space user_space/urgent user_space/non-urgent \
user_space/media; do
cset_dir="${cpuset_root_dir}/${cset}"
mkdir -p "${cset_dir}" # croslint: disable
echo "${cpuset_root_cpus}" > "${cset_dir}/cpus"
echo "${cpuset_root_mems}" > "${cset_dir}/mems"
done
# Adjust cpusets of the rest of the created containers to
# also have all available cpus and all mems.
for cset in session_manager_containers chronos_containers user_containers;
do
cset_dir="${cpuset_root_dir}/${cset}"
if [ -d "${cset_dir}" ]; then
echo "${cpuset_root_cpus}" > "${cset_dir}/cpus"
echo "${cpuset_root_mems}" > "${cset_dir}/mems"
fi
done
fi
# Create resourced's parent cgroup. Sub-cgroups are created and managed by
# resourced at runtime.
resourced_cpu_cgroup=/sys/fs/cgroup/cpu/resourced
resourced_cpuset_cgroup=/sys/fs/cgroup/cpuset/resourced
mkdir -p "${resourced_cpu_cgroup}" "${resourced_cpuset_cgroup}" \
# croslint: disable
chown -R resourced "${resourced_cpu_cgroup}" "${resourced_cpuset_cgroup}" \
# croslint: disable
# Create a cpu cgroup for each VM type. Default cpu.shares is 1024. Limit the
# VMs to 7/8ths of that initially.
cgroup_dir="/sys/fs/cgroup/cpu"
for vm_type in termina plugin ; do
mkdir -p "${cgroup_dir}/${vm_type}" \
"${cgroup_dir}/${vm_type}-vcpus" # croslint: disable
echo 896 > "${cgroup_dir}/${vm_type}/cpu.shares"
echo 896 > "${cgroup_dir}/${vm_type}-vcpus/cpu.shares"
done
end script