blob: d007d5e783e6d61e75392bb07ea59ae64863007d [file] [log] [blame]
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# 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"
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"
mount -t tmpfs -o mode=755,${default_mount_opts} none /sys/fs/cgroup
for subsys in cpu freezer devices cpuacct cpuset schedtune 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}
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
if id -u android-root 2>/dev/null; then
chown android-root:android-root \
/sys/fs/cgroup/${subsys}/session_manager_containers
fi
if id -u user-containers 2>/dev/null; then
mkdir -p /sys/fs/cgroup/${subsys}/user_containers
chown user-containers:user-containers \
/sys/fs/cgroup/${subsys}/user_containers
if [ "${subsys}" = "freezer" ]; then
chown power:power /sys/fs/cgroup/freezer/user_containers/freezer.state
fi
fi
mkdir -p /sys/fs/cgroup/${subsys}/chronos_containers
chown chronos:chronos /sys/fs/cgroup/${subsys}/chronos_containers
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
chown power:power \
/sys/fs/cgroup/${subsys}/chronos_containers/freezer.state
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}"
chown chronos:chronos "${cset_dir}/tasks"
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 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/vms"
for vm_type in termina plugin arc ; do
mkdir -p "${cgroup_dir}/${vm_type}"
echo 896 > "${cgroup_dir}/${vm_type}/cpu.shares"
for entry in tasks cpu.shares ; do
chown root:crosvm "${cgroup_dir}/${vm_type}/${entry}"
chmod g+w "${cgroup_dir}/${vm_type}/${entry}"
done
done
schedtune_root_dir="/sys/fs/cgroup/schedtune"
if [ -d "${schedtune_root_dir}" ]; then
for cset in chrome chrome/urgent; do
cset_dir="${schedtune_root_dir}/${cset}"
mkdir -p "${cset_dir}"
chown chronos:chronos "${cset_dir}/tasks"
done
fi
end script