Linux Test Project
 help / color / mirror / Atom feed
From: Richard Palethorpe <rpalethorpe@suse.de>
To: Luke Nowakowski-Krijger <luke.nowakowskikrijger@canonical.com>
Cc: ltp@lists.linux.it
Subject: Re: [LTP] [PATCH v3 08/16] controllers: Expand cgroup_lib shell library
Date: Mon, 07 Mar 2022 11:00:09 +0000	[thread overview]
Message-ID: <87wnh6m2fp.fsf@suse.de> (raw)
In-Reply-To: <ef5d94799195f00c6ab1fffe612e62bf1ee530a7.1646434670.git.luke.nowakowskikrijger@canonical.com>

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.

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

  reply	other threads:[~2022-03-07 11:23 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-04 23:18 [LTP] [PATCH v2 00/16] Expand Cgroup lib and modify controller tests Luke Nowakowski-Krijger
2022-03-04 23:18 ` [LTP] [PATCH v3 01/16] API/cgroup: Modify tst_cg_print_config for parsing and consumption Luke Nowakowski-Krijger
2022-03-04 23:18 ` [LTP] [PATCH 02/16] API/cgroup: Add option for specific pid to tst_cg_opts Luke Nowakowski-Krijger
2022-03-04 23:18 ` [LTP] [PATCH v2 03/16] API/cgroup: Add cgroup_find_root helper function Luke Nowakowski-Krijger
2022-03-04 23:18 ` [LTP] [PATCH v3 04/16] API/cgroup: Implement tst_cg_load_config Luke Nowakowski-Krijger
2022-03-07  9:05   ` Richard Palethorpe
2022-03-16 22:38     ` Luke Nowakowski-Krijger
2022-03-17  7:07       ` Richard Palethorpe
2022-04-27 17:38         ` Luke Nowakowski-Krijger
2022-04-28  9:17           ` Li Wang
2022-03-04 23:18 ` [LTP] [PATCH v2 05/16] API/cgroup: Add more controllers to tst_cgroup Luke Nowakowski-Krijger
2022-03-07 11:24   ` Richard Palethorpe
2022-03-16  9:35     ` Li Wang
2022-03-04 23:18 ` [LTP] [PATCH 06/16] API/cgroup: refuse to mount blkio when io controller is mounted Luke Nowakowski-Krijger
2022-03-16 10:01   ` Li Wang
2022-03-04 23:18 ` [LTP] [PATCH v2 07/16] testcases/lib: Implement tst_cgctl binary Luke Nowakowski-Krijger
2022-03-04 23:18 ` [LTP] [PATCH v3 08/16] controllers: Expand cgroup_lib shell library Luke Nowakowski-Krijger
2022-03-07 11:00   ` Richard Palethorpe [this message]
2022-03-07 11:39     ` Richard Palethorpe
2022-03-16  9:46       ` Li Wang
2022-03-16 21:46         ` Luke Nowakowski-Krijger
2022-03-17  5:38           ` Li Wang
2022-03-04 23:18 ` [LTP] [PATCH v2 09/16] controllers: Update cgroup_fj_* to use newer cgroup lib and test lib Luke Nowakowski-Krijger
2022-03-04 23:18 ` [LTP] [PATCH v2 10/16] controllers: Update memcg_control_test to newer test lib and cgroup lib Luke Nowakowski-Krijger
2022-03-04 23:18 ` [LTP] [PATCH v2 11/16] controllers: Update memcg/regression/* to new test " Luke Nowakowski-Krijger
2022-03-04 23:18 ` [LTP] [PATCH v2 12/16] controllers: Update memcg_stress_test to use newer " Luke Nowakowski-Krijger
2022-03-04 23:18 ` [LTP] [PATCH v2 13/16] controllers: update memcg/functional " Luke Nowakowski-Krijger
2022-03-04 23:18 ` [LTP] [PATCH v2 14/16] controllers: Update pids.sh " Luke Nowakowski-Krijger
2022-03-04 23:18 ` [LTP] [PATCH v2 15/16] controllers: update cpuset_regression_test.sh " Luke Nowakowski-Krijger
2022-03-04 23:18 ` [LTP] [PATCH 16/16] controllers: update cgroup_regression_test " Luke Nowakowski-Krijger
2022-03-16  9:09   ` Li Wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87wnh6m2fp.fsf@suse.de \
    --to=rpalethorpe@suse.de \
    --cc=ltp@lists.linux.it \
    --cc=luke.nowakowskikrijger@canonical.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox