# 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"

  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}/cgroup.procs" # croslint: disable
      chown chronos:chronos "${cset_dir}/tasks"
      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}"
      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"
  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

  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
