unplugged-system/external/ltp/testcases/kernel/controllers/cgroup_lib.sh

137 lines
3.4 KiB
Bash

#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (c) 2019-2022 Petr Vorel <pvorel@suse.cz>
# Copyright (c) 2018-2019 ARM Ltd. All Rights Reserved.
# Copyright (c) 2022 Canonical Ltd.
_cgroup_state=
# Find mountpoint of the given controller
# USAGE: cgroup_get_mountpoint CONTROLLER
# RETURNS: Prints the mountpoint of the given controller
# Must call cgroup_require before calling
cgroup_get_mountpoint()
{
local ctrl="$1"
local mountpoint
[ "$ctrl" ] || tst_brk TBROK "cgroup_get_mountpoint: controller not defined"
[ "$_cgroup_state" ] || tst_brk TBROK "cgroup_get_mountpoint: No previous state found. Forgot to call cgroup_require?"
mountpoint=$(echo "$_cgroup_state" | grep -w "^$ctrl" | awk '{ print $4 }')
echo "$mountpoint"
return 0
}
# Get the test path of a given controller that has been created by the cgroup C API
# USAGE: cgroup_get_test_path CONTROLLER
# RETURNS: Prints the path to the test direcory
# Must call cgroup_require before calling
cgroup_get_test_path()
{
local ctrl="$1"
local mountpoint
local test_path
[ "$ctrl" ] || tst_brk TBROK "cgroup_get_test_path: controller not defined"
[ "$_cgroup_state" ] || tst_brk TBROK "cgroup_get_test_path: No previous state found. Forgot to call cgroup_require?"
mountpoint=$(cgroup_get_mountpoint "$ctrl")
test_path="$mountpoint/ltp/test-$$"
[ ! -e "$test_path" ] && tst_brk TBROK "cgroup_get_test_path: No test path found. Forgot to call cgroup_require?"
echo "$test_path"
return 0
}
# Gets the cgroup version of the given controller
# USAGE: cgroup_get_version CONTROLLER
# RETURNS: "1" if version 1 and "2" if version 2
# Must call cgroup_require before calling
cgroup_get_version()
{
local ctrl="$1"
local version
[ "$ctrl" ] || tst_brk TBROK "cgroup_get_version: controller not defined"
[ "$_cgroup_state" ] || tst_brk TBROK "cgroup_get_version: No previous state found. Forgot to call cgroup_require?"
version=$(echo "$_cgroup_state" | grep -w "^$ctrl" | awk '{ print $2 }')
[ "$version" ] || tst_brk TBROK "cgroup_get_version: Could not find controller $ctrl"
echo "$version"
return 0
}
# Cleans up any setup done by calling cgroup_require.
# USAGE: cgroup_cleanup
# Can be safely called even when no setup has been done
cgroup_cleanup()
{
[ "$_cgroup_state" ] || return 0
ROD tst_cgctl cleanup "$_cgroup_state"
_cgroup_state=
return 0
}
# Get the task list of the given controller
# USAGE: cgroup_get_task_list CONTROLLER
# RETURNS: prints out "cgroup.procs" if version 2 otherwise "tasks"
# Must call cgroup_require before calling
cgroup_get_task_list()
{
local ctrl="$1"
local version
[ "$ctrl" ] || tst_brk TBROK "cgroup_get_task_list: controller not defined"
version=$(cgroup_get_version "$ctrl")
if [ "$version" = "2" ]; then
echo "cgroup.procs"
else
echo "tasks"
fi
return 0
}
# Mounts and configures the given controller
# USAGE: cgroup_require CONTROLLER
cgroup_require()
{
local ctrl="$1"
local ret
[ "$ctrl" ] || tst_brk TBROK "cgroup_require: controller not defined"
[ ! -f /proc/cgroups ] && tst_brk TCONF "Kernel does not support control groups"
_cgroup_state=$(tst_cgctl require "$ctrl" $$)
ret=$?
if [ $ret -eq 32 ]; then
tst_brk TCONF "'tst_cgctl require' exited. Controller is probably not available?"
return $ret
fi
if [ $ret -ne 0 ]; then
tst_brk TBROK "'tst_cgctl require' exited"
return $ret
fi
[ "$_cgroup_state" ] || tst_brk TBROK "cgroup_require: No state was set after call to tst_cgctl require?"
return 0
}
. tst_test.sh