| # 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 |
| |
| 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; 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" ]; then |
| # To be compatible with how Android container mounts cpusets |
| # we mount without prefix (so "cpuset.cpus" turns into "cpus"). |
| mount_opts="${mount_opts},noprefix" |
| fi |
| mount -t cgroup cgroup /sys/fs/cgroup/${subsys} \ |
| -o ${subsys},${mount_opts} || log ${subsys} |
| 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 |
| fi |
| mkdir -p /sys/fs/cgroup/${subsys}/chronos_containers |
| chown chronos:chronos /sys/fs/cgroup/${subsys}/chronos_containers |
| done |
| # Initialize cpusets for containers to the default sets. |
| cat /sys/fs/cgroup/cpuset/cpus > /sys/fs/cgroup/cpuset/session_manager_containers/cpus |
| cat /sys/fs/cgroup/cpuset/mems > /sys/fs/cgroup/cpuset/session_manager_containers/mems |
| cat /sys/fs/cgroup/cpuset/cpus > /sys/fs/cgroup/cpuset/chronos_containers/cpus |
| cat /sys/fs/cgroup/cpuset/mems > /sys/fs/cgroup/cpuset/chronos_containers/mems |
| cat /sys/fs/cgroup/cpuset/cpus > /sys/fs/cgroup/cpuset/user_containers/cpus |
| cat /sys/fs/cgroup/cpuset/mems > /sys/fs/cgroup/cpuset/user_containers/mems |
| |
| # 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 session_manager_containers cpuset to also have |
| # all available cpus and all mems. |
| cset_dir="/sys/fs/cgroup/cpuset/session_manager_containers" |
| echo "${cpuset_root_cpus}" > "${cset_dir}/cpus" |
| echo "${cpuset_root_mems}" > "${cset_dir}/mems" |
| fi |
| |
| 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 |