[LTP] [PATCH v3 08/16] controllers: Expand cgroup_lib shell library
Richard Palethorpe
rpalethorpe@suse.de
Mon Mar 7 12:00:09 CET 2022
Hello Luke,
Luke Nowakowski-Krijger <luke.nowakowskikrijger@canonical.com> writes:
> Expand the cgroup_lib library by using the tst_cgctl binary
> utility to make calls to the Cgroup C API to simplify and centralize the
> mounting and cleanup process of Cgroups
>
> Signed-off-by: Luke Nowakowski-Krijger <luke.nowakowskikrijger@canonical.com>
> ---
> v2: Add "^" to propery grep the correct mountpoint.
> Removed is_cgroup_enabled_and_available function and put the check
> in cgroup_require().
> Check if /proc/cgroups exists in cgroup_require().
> Change to TCONF if controllers not available.
> v3: Add copyright.
> Change awks to grab new config variables.
> Change version from v2 to just 2 to match config variables.
>
> testcases/kernel/controllers/cgroup_lib.sh | 129 +++++++++++++++++----
> 1 file changed, 109 insertions(+), 20 deletions(-)
>
> diff --git a/testcases/kernel/controllers/cgroup_lib.sh b/testcases/kernel/controllers/cgroup_lib.sh
> index 7918b5636..ed8549c70 100644
> --- a/testcases/kernel/controllers/cgroup_lib.sh
> +++ b/testcases/kernel/controllers/cgroup_lib.sh
> @@ -2,38 +2,127 @@
> # SPDX-License-Identifier: GPL-2.0-or-later
> # Copyright (c) 2019 Petr Vorel <pvorel@suse.cz>
> # Copyright (c) 2018-2019 ARM Ltd. All Rights Reserved.
> +# Copyright (c) 2022 Canonical Ltd.
>
> . tst_test.sh
>
> -# Find mountpoint to given subsystem
> -# get_cgroup_mountpoint SUBSYSTEM
> -# RETURN: 0 if mountpoint found, otherwise 1
> -get_cgroup_mountpoint()
> +_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
> +
> + [ $# -eq 0 ] && 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
> +
> + [ $# -eq 0 ] && 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
> +
> + [ $# -eq 0 ] && 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()
> {
> - local subsystem=$1
> - local mntpoint
> + [ "$_cgroup_state" = "" ] && return 0
>
> - [ $# -eq 0 ] && tst_brk TBROK "get_cgroup_mountpoint: subsystem not defined"
> + tst_cgctl cleanup "$_cgroup_state"
>
> - mntpoint=$(grep cgroup /proc/mounts | grep -w $subsystem | awk '{ print $2 }')
> - [ -z "$mntpoint" ] && return 1
> + _cgroup_state=""
>
> - echo $mntpoint
> return 0
> }
>
> -# Check if given subsystem is supported and enabled
> -# is_cgroup_subsystem_available_and_enabled SUBSYSTEM
> -# RETURN: 0 if subsystem supported and enabled, otherwise 1
> -is_cgroup_subsystem_available_and_enabled()
> +# 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 val
> - local subsystem=$1
> + local ctrl="$1"
> + local version
> +
> + [ $# -eq 0 ] && tst_brk TBROK "cgroup_get_task_list: controller not defined"
>
> - [ $# -eq 0 ] && tst_brk TBROK "is_cgroup_subsystem_available_and_enabled: subsystem not defined"
> + version=$(cgroup_get_version "$ctrl")
>
> - val=$(grep -w $subsystem /proc/cgroups | awk '{ print $4 }')
> - [ "$val" = "1" ] && return 0
> + if [ "$version" = "2" ]; then
> + echo "cgroup.procs"
> + else
> + echo "tasks"
> + fi
>
> - return 1
> + return 0
> +}
> +
> +# Mounts and configures the given controller
> +# USAGE: cgroup_require CONTROLLER
> +cgroup_require()
> +{
> + local ctrl="$1"
> + local exists
> +
> + [ $# -eq 0 ] && tst_brk TBROK "cgroup_require: controller not defined"
> +
> + [ ! -f /proc/cgroups ] && tst_brk TCONF "Kernel does not support
> control groups"
The tst_cgroup lib can handle this. Also is it guaranteed that
/proc/cgroups exists if cgroups are enabled?
> +
> + exists=$(grep -w $ctrl /proc/cgroups | awk '{ print $4 }')
> + [ "$exists" != "1" ] && tst_brk TCONF "cgroup_require:
> Controller not available or not enabled"
For some reason this fails on my VM where no cgroups are mounted
already. Also it's redundant because tst_cgroup should handle it.
> +
> + _cgroup_state=$(tst_cgctl require "$ctrl" $$)
> +
> + [ "$_cgroup_state" = "" ] && tst_brk TBROK "cgroup_require: No state was set after call. Controller '$ctrl' maybe does not exist?"
> +
> + return 0
> }
--
Thank you,
Richard.
More information about the ltp
mailing list