[LTP] [PATCH 09/16] controllers: Update cgroup_fj_* to use newer cgroup lib and test lib

Li Wang liwang@redhat.com
Mon Jan 24 09:51:52 CET 2022


On Wed, Jan 19, 2022 at 10:44 PM Luke Nowakowski-Krijger
<luke.nowakowskikrijger@canonical.com> wrote:
>
> Update the cgroup_fj_* tests to use the newer test lib and to use the
> updated version of the cgroup lib which handles mounting and unmounting
> for both v1 and v2 controllers.
>
> The tests were modified to accomodate testing the v2 controller

accommodate ^

> interfaces where it still made sense, and in other places tests were
> skipped as they were testing using specific parts of the v1 interface
> that doesen't exist on v2 controllers.

doesn't ^

>
> Also updated the licensing info at the beginning of the file with SPDX
> license identifier.
>
> Signed-off-by: Luke Nowakowski-Krijger <luke.nowakowskikrijger@canonical.com>
> ---
>  .../controllers/cgroup_fj/cgroup_fj_common.sh | 105 ++++-------
>  .../cgroup_fj/cgroup_fj_function.sh           | 169 ++++++++++--------
>  .../controllers/cgroup_fj/cgroup_fj_proc.c    |  24 +--
>  .../controllers/cgroup_fj/cgroup_fj_stress.sh | 168 ++++++++---------
>  4 files changed, 215 insertions(+), 251 deletions(-)
>
> diff --git a/testcases/kernel/controllers/cgroup_fj/cgroup_fj_common.sh b/testcases/kernel/controllers/cgroup_fj/cgroup_fj_common.sh
> index 53ab637e8..9017a3cab 100755
> --- a/testcases/kernel/controllers/cgroup_fj/cgroup_fj_common.sh
> +++ b/testcases/kernel/controllers/cgroup_fj/cgroup_fj_common.sh
> @@ -1,33 +1,19 @@
>  #!/bin/sh
> -
> -################################################################################
> -##                                                                            ##
> -## Copyright (c) 2009 FUJITSU LIMITED                                         ##
> -##  Author: Shi Weihua <shiwh@cn.fujitsu.com>                                 ##
> -## Copyright (c) 2015 Cedric Hnyda <chnyda@suse.com>                          ##
> -## Copyright (c) 2015-2016 Cyril Hrubis <chrubis@suse.cz>                     ##
> -##                                                                            ##
> -## This program is free software;  you can redistribute it and#or modify      ##
> -## it under the terms of the GNU General Public License as published by       ##
> -## the Free Software Foundation; either version 2 of the License, or          ##
> -## (at your option) any later version.                                        ##
> -##                                                                            ##
> -## This program is distributed in the hope that it will be useful, but        ##
> -## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
> -## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
> -## for more details.                                                          ##
> -##                                                                            ##
> -## You should have received a copy of the GNU General Public License          ##
> -## along with this program;  if not, write to the Free Software Foundation,   ##
> -## Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA           ##
> -##                                                                            ##
> -################################################################################
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (c) 2009 FUJITSU LIMITED
> +# Copyright (c) 2015 Cedric Hnyda <chnyda@suse.com>
> +# Copyright (c) 2015-2016 Cyril Hrubis <chrubis@suse.cz>
> +# Author: Shi Weihua <shiwh@cn.fujitsu.com>
>
>  for arg; do
>      TCID="${TCID}_$arg"
>  done
>
> -. test.sh
> +TST_NEEDS_CMDS="rmdir killall"
> +TST_NEEDS_ROOT=1
> +TST_NEEDS_TMPDIR=1
> +
> +. cgroup_lib.sh
>
>  exist_subsystem()

This function is redundant since we have moved the
existence check into cgroup_require(), isn't it?

>  {
> @@ -46,13 +32,13 @@ attach_and_check()
>      local task
>      shift
>
> -    tst_resm TINFO "Attaching task $pid to $path"
> +    tst_res TINFO "Attaching task $pid to $path"
>
> -    ROD echo "$pid" \> "$path/tasks"
> +    ROD echo "$pid" \> "$path/$task_list"
>
> -    for task in $(cat "$path/tasks"); do
> +    for task in $(cat "$path/$task_list"); do
>          if [ "$task" -ne "$pid" ]; then
> -            tst_resm TINFO "Unexpected pid $task in $path/tasks, expected $pid"
> +            tst_res TINFO "Unexpected pid $task in $path/$task_list, expected $pid"
>              return 1
>          fi
>      done
> @@ -64,11 +50,13 @@ create_subgroup()
>  {
>      path="$1"
>
> -    ROD mkdir "$path"
> +    [ ! -d "$path" ] && ROD mkdir "$path"
>
>      # cpuset.cpus and cpuset.mems must be initialized with suitable value
> -    # before any pids are attached
> -    if [ "$subsystem" = "cpuset" ]; then
> +    # before any pids are attached.
> +    # Only needs to be done for cgroup v1 as sets are inherited from parents
> +    # by default in cgroup v2.
> +    if [ "$cgroup_v" = "V1" ] && [ "$subsystem" = "cpuset" ]; then
>          if [ -e "$mount_point/cpus" ]; then
>              ROD cat "$mount_point/cpus" \> "$path/cpus"
>              ROD cat "$mount_point/mems" \> "$path/mems"
> @@ -79,54 +67,25 @@ create_subgroup()
>      fi
>  }
>
> -
> -setup()
> +common_setup()
>  {
> -    tst_require_root
> -    tst_require_cmds killall
> -
> -    if [ ! -f /proc/cgroups ]; then
> -        tst_brkm TCONF "Kernel does not support for control groups"
> -    fi
> -
> -    exist_subsystem "$subsystem"
> -
> -    tst_tmpdir
> -    TST_CLEANUP=cleanup
> -
> -    mount_point=`grep -w $subsystem /proc/mounts | grep -w "cgroup" | \
> -       cut -f 2 | cut -d " " -f2`
> -
> -    if [ -z "$mount_point" ]; then
> -        try_umount=1
> -        mount_point="/dev/cgroup"
> -       tst_resm TINFO "Subsystem $subsystem is not mounted, mounting it at $mount_point"
> -        ROD mkdir $mount_point
> -        ROD mount -t cgroup -o "$subsystem" "ltp_cgroup" "$mount_point"
> -    else
> -       tst_resm TINFO "Subsystem $subsystem is mounted at $mount_point"
> -    fi
> +    cgroup_require "$subsystem"

> +    mount_point=$(cgroup_get_mountpoint "$subsystem")
> +    start_path=$(cgroup_get_test_path "$subsystem")
> +    cgroup_v=$(cgroup_get_version "$subsystem")
> +    task_list=$(cgroup_get_task_list "$subsystem")

Maybe declare these variables at the top of this file, because
we hope to export and use them globally.

> +
> +    [ "$cgroup_v" = "V2" ] && ROD echo "+$subsystem" \> "$start_path/cgroup.subtree_control"

Can we just do this in tst_cgctl.c automatically if it requires the
subsystem on V2.
(or at least move it to cgroup_lib.sh)
Then people don't need to take care of this additionally.

> +    tst_res TINFO "test starts with cgroup $cgroup_v"
>  }
>
> -cleanup()
> +common_cleanup()
>  {
> -    tst_rmdir
> -
>      killall -9 cgroup_fj_proc >/dev/null 2>&1
>
> -    tst_resm TINFO "Removing all ltp subgroups..."
> -
> -    find "$mount_point/ltp/" -depth -type d -exec rmdir '{}' \;
> +    tst_res TINFO "Removing all ltp subgroups..."
>
> -    if [ -z "$try_umount" ]; then
> -       return
> -    fi
> -
> -    if grep -q "$mount_point" /proc/mounts; then
> -        EXPECT_PASS umount "$mount_point"
> -    fi
> +    [ -d "$start_path" ] && find "$start_path" -depth -type d -exec rmdir '{}' \;
>
> -    if [ -e "$mount_point" ]; then
> -        EXPECT_PASS rmdir "$mount_point"
> -    fi
> +    cgroup_cleanup
>  }
> diff --git a/testcases/kernel/controllers/cgroup_fj/cgroup_fj_function.sh b/testcases/kernel/controllers/cgroup_fj/cgroup_fj_function.sh
> index fc3ad1b63..07373dcfe 100755
> --- a/testcases/kernel/controllers/cgroup_fj/cgroup_fj_function.sh
> +++ b/testcases/kernel/controllers/cgroup_fj/cgroup_fj_function.sh
> @@ -1,30 +1,16 @@
>  #!/bin/sh
> -
> -################################################################################
> -##                                                                            ##
> -## Copyright (c) 2009 FUJITSU LIMITED                                         ##
> -##  Author: Shi Weihua <shiwh@cn.fujitsu.com>                                 ##
> -## Copyright (c) 2015 Cedric Hnyda <chnyda@suse.com>                          ##
> -## Copyright (c) 2015-2016 Cyril Hrubis <chrubis@suse.cz>                     ##
> -##                                                                            ##
> -## This program is free software;  you can redistribute it and#or modify      ##
> -## it under the terms of the GNU General Public License as published by       ##
> -## the Free Software Foundation; either version 2 of the License, or          ##
> -## (at your option) any later version.                                        ##
> -##                                                                            ##
> -## This program is distributed in the hope that it will be useful, but        ##
> -## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
> -## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
> -## for more details.                                                          ##
> -##                                                                            ##
> -## You should have received a copy of the GNU General Public License          ##
> -## along with this program;  if not, write to the Free Software Foundation,   ##
> -## Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA           ##
> -##                                                                            ##
> -################################################################################
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (c) 2009 FUJITSU LIMITED
> +# Copyright (c) 2015 Cedric Hnyda <chnyda@suse.com>
> +# Copyright (c) 2015-2016 Cyril Hrubis <chrubis@suse.cz>
> +# Author: Shi Weihua <shiwh@cn.fujitsu.com>
>
>  TCID="cgroup_fj_function2"
> -TST_TOTAL=7
> +TST_TESTFUNC=test
> +TST_SETUP=setup
> +TST_CLEANUP=cleanup
> +TST_CNT=9
> +TST_POS_ARGS=1
>
>  . cgroup_fj_common.sh
>
> @@ -36,7 +22,7 @@ usage_and_exit()
>      echo "  ./cgroup_fj_function2.sh subsystem"
>      echo "example: ./cgroup_fj_function2.sh cpuset"
>
> -    tst_brkm TBROK "$1"
> +    tst_brk TBROK "$1"
>  }
>
>  if [ "$#" -ne "1" ]; then
> @@ -46,49 +32,67 @@ fi
>  # Move a task from group to group
>  test1()
>  {
> +    # mv'ing cgroups is not available in cgroup2
> +    if [ "$cgroup_v" = "V2" ]; then
> +        tst_res TCONF "Controller mounted on cgroup2 hierachy, skipping test"
> +        return
> +    fi
> +
>      if ! attach_and_check "$pid" "$start_path/ltp_1"; then
> -         tst_resm TFAIL "Failed to attach task"
> +         tst_res TFAIL "Failed to attach task"
>           return
>      fi
>
>      if ! attach_and_check "$pid" "$start_path"; then
> -         tst_resm TFAIL "Failed to attach task"
> +         tst_res TFAIL "Failed to attach task"
>           return
>      fi
>
> -    tst_resm TPASS "Task attached succesfully"
> +    tst_res TPASS "Task attached succesfully"
>  }
>
>  # Group can be renamed with mv
>  test2()
>  {
> +    # mv'ing cgroups is not available in cgroup2
> +    if [ "$cgroup_v" = "V2" ]; then
> +        tst_res TCONF "Controller mounted on cgroup2 hierachy, skipping test"
> +        return
> +    fi
> +
>      create_subgroup "$start_path/ltp_2"
>
>      if ! mv "$start_path/ltp_2" "$start_path/ltp_3"; then
> -        tst_resm TFAIL "Failed to move $start_path/ltp_2 to $start_path/ltp_3"
> +        tst_res TFAIL "Failed to move $start_path/ltp_2 to $start_path/ltp_3"
>          rmdir "$start_path/ltp_2"
>          return
>      fi
>
>      if ! rmdir "$start_path/ltp_3"; then
> -        tst_resm TFAIL "Failed to remove $start_path/ltp_3"
> +        tst_res TFAIL "Failed to remove $start_path/ltp_3"
>          return
>      fi
>
> -    tst_resm TPASS "Successfully moved $start_path/ltp_2 to $start_path/ltp_3"
> +    tst_res TPASS "Successfully moved $start_path/ltp_2 to $start_path/ltp_3"
>  }
>
>  # Group can be renamed with mv unless the target name exists
>  test3()
>  {
> +    # mv'ing cgroups is not available in cgroup2
> +    if [ "$cgroup_v" = "V2" ]; then
> +        tst_res TCONF "Controller mounted on cgroup2 hierachy, skipping test"
> +        return
> +    fi
> +
>      create_subgroup "$start_path/ltp_2"
>
>      if mv "$start_path/ltp_2" "$start_path/ltp_1" > /dev/null 2>&1; then
> -        tst_resm TFAIL "Moved $start_path/ltp_2 over existing $start_path/ltp_1"
> +        tst_res TFAIL "Moved $start_path/ltp_2 over existing $start_path/ltp_1"
>          return
>      fi
>
> -    tst_resm TPASS "Failed to move $start_path/ltp_2 over existing $start_path/ltp_1"
> +    tst_res TPASS "Failed to move $start_path/ltp_2 over existing $start_path/ltp_1"
>
>      ROD rmdir "$start_path/ltp_2"
>  }
> @@ -97,77 +101,104 @@ test3()
>  test4()
>  {
>      if ! attach_and_check "$pid" "$start_path/ltp_1"; then
> -        tst_resm TFAIL "Failed to attach $pid to $start_path/ltp_1"
> +        tst_res TFAIL "Failed to attach $pid to $start_path/ltp_1"
>          return
>      fi
>
>      if rmdir "$start_path/ltp_1" > /dev/null 2>&1; then
> -        tst_resm TFAIL "Removed $start_path/ltp_1 which contains task $pid"
> -        create_subgroup "$start_path/ltp_1"
> +        tst_res TFAIL "Removed $start_path/ltp_1 which contains task $pid"
>          return
>      fi
>
> -    tst_resm TPASS "Group $start_path/ltp_1 with task $pid cannot be removed"
> +    tst_res TPASS "Group $start_path/ltp_1 with task $pid cannot be removed"
>  }
>
>  # Group with a subgroup cannot be removed
>  test5()
>  {
> +    # We need to move the tasks back to root to create a subgroup
> +    if [ "$cgroup_v" = "V2" ]; then
> +        for pid in $(cat "$start_path/ltp_1/$task_list"); do
> +                   echo $pid > "$mount_point/$task_list" 2> /dev/null
> +           done
> +
> +        ROD echo "+$subsystem" \> "$start_path/ltp_1/cgroup.subtree_control"
> +    fi
> +
>      create_subgroup "$start_path/ltp_1/a"
>
>      if rmdir "$start_path/ltp_1" > /dev/null 2>&1; then
> -        tst_resm TFAIL "Removed $start_path/ltp_1 which contains subdir 'a'"
> +        tst_res TFAIL "Removed $start_path/ltp_1 which contains subdir 'a'"
>          return
>      fi
>
> -    tst_resm TPASS "Dir $start_path/ltp_1 with subdir 'a' cannot be removed"
> +    tst_res TPASS "Dir $start_path/ltp_1 with subdir 'a' cannot be removed"
>
>      ROD rmdir "$start_path/ltp_1/a"
>
> -    ROD echo "$pid" \> "$start_path/tasks"
> +    [ "$cgroup_v" = "V2" ] && ROD echo "-$subsystem" \> "$start_path/ltp_1/cgroup.subtree_control"
> +    ROD echo "$pid" \> "$start_path/ltp_1/$task_list"
>  }
>
>  # Group cannot be moved outside of hierarchy
>  test6()
>  {
> +    # mv'ing cgroups is not available in cgroup2
> +    if [ "$cgroup_v" = "V2" ]; then
> +        tst_res TCONF "Controller mounted on cgroup2 hierachy, skipping test"
> +        return
> +    fi
> +
>      if mv "$start_path/ltp_1" "$PWD/ltp" > /dev/null 2>&1; then
> -        tst_resm TFAIL "Subgroup $start_path/ltp_1 outside hierarchy to $PWD/ltp"
> +        tst_res TFAIL "Subgroup $start_path/ltp_1 outside hierarchy to $PWD/ltp"
>          return
>      fi
>
> -    tst_resm TPASS "Subgroup $start_path/ltp_1 cannot be moved to $PWD/ltp"
> +    tst_res TPASS "Subgroup $start_path/ltp_1 cannot be moved to $PWD/ltp"
>  }
>
>  # Tasks file cannot be removed
>  test7()
>  {
> -    if rm "$start_path/ltp_1/tasks" > /dev/null 2>&1; then
> -        tst_resm TFAIL "Tasks file $start_path/ltp_1/tasks could be removed"
> +    if rm "$start_path/ltp_1/$task_list" > /dev/null 2>&1; then
> +        tst_res TFAIL "Tasks file $start_path/ltp_1/$task_list could be removed"
>          return
>      fi
>
> -    tst_resm TPASS "Tasks file $start_path/ltp_1/tasks cannot be removed"
> +    tst_res TPASS "Tasks file $start_path/ltp_1/tasks cannot be removed"
>  }
>
>  # Test notify_on_release with invalid inputs
>  test8()
>  {
> +    # notify_on_release is not available in cgroup2 so skip the test
> +    if [ "$cgroup_v" = "V2" ]; then
> +        tst_res TCONF "Controller mounted on cgroup2 hierachy, skipping test"
> +        return
> +    fi
> +
>      if echo "-1" > "$start_path/ltp_1/notify_on_release" 2>/dev/null; then
> -        tst_resm TFAIL "Can write -1 to $start_path/ltp_1/notify_on_release"
> +        tst_res TFAIL "Can write -1 to $start_path/ltp_1/notify_on_release"
>          return
>      fi
>
>      if echo "ltp" > "$start_path/ltp_1/notify_on_release" 2>/dev/null; then
> -        tst_resm TFAIL "Can write ltp to $start_path/ltp_1/notify_on_release"
> +        tst_res TFAIL "Can write ltp to $start_path/ltp_1/notify_on_release"
>          return
>      fi
>
> -    tst_resm TPASS "Cannot write invalid values to $start_path/ltp_1/notify_on_release"
> +    tst_res TPASS "Cannot write invalid values to $start_path/ltp_1/notify_on_release"
>  }
>
>  # Test that notify_on_release can be changed
>  test9()
>  {
> +    # notify_on_release is not available in cgroup2 so skip the test
> +    if [ "$cgroup_v" = "V2" ]; then
> +        tst_res TCONF "Controller mounted on cgroup2 hierachy, skipping test"
> +        return
> +    fi
> +
>      local notify=$(ROD cat "$start_path/ltp_1/notify_on_release")
>      local value
>
> @@ -178,37 +209,29 @@ test9()
>      fi
>
>      if ! echo "$value" > "$start_path/ltp_1/notify_on_release"; then
> -        tst_resm TFAIL "Failed to set $start_path/ltp_1/notify_on_release to $value"
> +        tst_res TFAIL "Failed to set $start_path/ltp_1/notify_on_release to $value"
>          return
>      fi
>
>      ROD echo "$notify" \> "$start_path/ltp_1/notify_on_release"
>
> -    tst_resm TPASS "Set $start_path/ltp_1/notify_on_release to $value"
> +    tst_res TPASS "Set $start_path/ltp_1/notify_on_release to $value"
>  }
>
> -setup
> -
> -cgroup_fj_proc&
> -pid=$!
> -
> -start_path="$mount_point/ltp"
> -
> -create_subgroup "$start_path"
> -create_subgroup "$start_path/ltp_1"
> -
> -test1
> -test2
> -test3
> -test4
> -test5
> -test6
> -test7
> -test8
> -test9
> +setup()
> +{
> +    common_setup
> +    cgroup_fj_proc&
> +    pid=$!
> +    create_subgroup "$start_path/ltp_1"
> +}


Btw, I got a TBROK when running the "cgroup_fj_function.sh blkio", but this
looks not related to your patch, I'll try to look into the problem.

--------------
tst_cgroup.c:829: TINFO: Could not mount V1 CGroup on
/tmp/cgroup_blkio: EBUSY (16)
tst_cgroup.c:932: TCONF: 'blkio' controller required, but not available
cgroup_fj_function 1 TBROK: cgroup_require: No state was set after
call. Controller 'blkio' maybe does not exist?


>
> -ROD kill -9 $pid
> -wait $pid
> -ROD rmdir "$start_path/ltp_1"
> +cleanup()
> +{
> +    kill -9 $pid >/dev/null 2>&1
> +    wait $pid >/dev/null 2>&1
> +    rmdir "$start_path/ltp_1" >/dev/null 2>&1
> +    common_cleanup
> +}
>
> -tst_exit
> +tst_run
> diff --git a/testcases/kernel/controllers/cgroup_fj/cgroup_fj_proc.c b/testcases/kernel/controllers/cgroup_fj/cgroup_fj_proc.c
> index 93bc8b744..e3c1153cb 100644
> --- a/testcases/kernel/controllers/cgroup_fj/cgroup_fj_proc.c
> +++ b/testcases/kernel/controllers/cgroup_fj/cgroup_fj_proc.c
> @@ -1,24 +1,6 @@
> -/******************************************************************************/
> -/*                                                                            */
> -/* Copyright (c) 2009 FUJITSU LIMITED                                         */
> -/*                                                                            */
> -/* This program is free software;  you can redistribute it and/or modify      */
> -/* it under the terms of the GNU General Public License as published by       */
> -/* the Free Software Foundation; either version 2 of the License, or          */
> -/* (at your option) any later version.                                        */
> -/*                                                                            */
> -/* This program is distributed in the hope that it will be useful,            */
> -/* but WITHOUT ANY WARRANTY;  without even the implied warranty of            */
> -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See                  */
> -/* the GNU General Public License for more details.                           */
> -/*                                                                            */
> -/* You should have received a copy of the GNU General Public License          */
> -/* along with this program;  if not, write to the Free Software               */
> -/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    */
> -/*                                                                            */
> -/* Author: Shi Weihua <shiwh@cn.fujitsu.com>                                  */
> -/*                                                                            */
> -/******************************************************************************/
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +// Copyright (c) 2009 FUJITSU LIMITED
> +// Author: Shi Weihua <shiwh@cn.fujitsu.com>
>
>  #include <sys/types.h>
>  #include <sys/wait.h>
> diff --git a/testcases/kernel/controllers/cgroup_fj/cgroup_fj_stress.sh b/testcases/kernel/controllers/cgroup_fj/cgroup_fj_stress.sh
> index 292df6f6c..f0f6d32d4 100755
> --- a/testcases/kernel/controllers/cgroup_fj/cgroup_fj_stress.sh
> +++ b/testcases/kernel/controllers/cgroup_fj/cgroup_fj_stress.sh
> @@ -1,30 +1,16 @@
>  #!/bin/sh
> -
> -################################################################################
> -##                                                                            ##
> -## Copyright (c) 2009 FUJITSU LIMITED                                         ##
> -##  Author: Shi Weihua <shiwh@cn.fujitsu.com>                                 ##
> -## Copyright (c) 2015 Cedric Hnyda <chnyda@suse.com>                          ##
> -## Copyright (c) 2015-2016 Cyril Hrubis <chrubis@suse.cz>                     ##
> -##                                                                            ##
> -## This program is free software;  you can redistribute it and#or modify      ##
> -## it under the terms of the GNU General Public License as published by       ##
> -## the Free Software Foundation; either version 2 of the License, or          ##
> -## (at your option) any later version.                                        ##
> -##                                                                            ##
> -## This program is distributed in the hope that it will be useful, but        ##
> -## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
> -## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
> -## for more details.                                                          ##
> -##                                                                            ##
> -## You should have received a copy of the GNU General Public License          ##
> -## along with this program;  if not, write to the Free Software Foundation,   ##
> -## Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA           ##
> -##                                                                            ##
> -################################################################################
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (c) 2009 FUJITSU LIMITED
> +# Copyright (c) 2015 Cedric Hnyda <chnyda@suse.com>
> +# Copyright (c) 2015-2016 Cyril Hrubis <chrubis@suse.cz>
> +# Author: Shi Weihua <shiwh@cn.fujitsu.com>
>
>  TCID="cgroup_fj_stress"
> -TST_TOTAL=1
> +TST_CNT=1
> +TST_TESTFUNC=test
> +TST_SETUP=setup
> +TST_CLEANUP=cleanup
> +TST_POS_ARGS=4
>
>  . cgroup_fj_common.sh
>
> @@ -47,35 +33,9 @@ usage_and_exit()
>      echo "      each - attach process to each subgroup"
>      echo "example: ./cgroup_fj_stress.sh cpuset 1 1 one"
>      echo
> -    tst_brkm TBROK "$1"
> +    tst_brk TBROK "$1"
>  }
>
> -if [ "$#" -ne "4" ]; then
> -    usage_and_exit "Wrong number of parameters, expected 4"
> -fi
> -
> -case $subgroup_num in
> -    ''|*[!0-9]*) usage_and_exit "Number of subgroups must be possitive integer";;
> -    *) ;;
> -esac
> -
> -case $subgroup_depth in
> -    ''|*[!0-9]*) usage_and_exit "Depth of the subgroup tree must be possitive integer";;
> -    *) ;;
> -esac
> -
> -case $attach_operation in
> -    'none'|'one'|'each');;
> -    *) usage_and_exit "Invalid attach operation: $attach_operation";;
> -esac
> -
> -setup
> -
> -export TMPFILE=./tmp_tasks.$$
> -
> -count=0
> -collected_pids=
> -
>  build_subgroups()
>  {
>      local cur_path="$1"
> @@ -87,6 +47,12 @@ build_subgroups()
>      fi
>
>      create_subgroup "$cur_path"
> +
> +    # We can only attach processes to the leaves of the tree in cgroup v2 which
> +    # means we need to enable the controllers everywhere inbetween.
> +    if [ "$cgroup_v" = "V2" ] && [ "$cur_depth" -ne "$subgroup_depth" ]; then
> +        ROD echo "+$subsystem" \> "$cur_path/cgroup.subtree_control"
> +    fi
>      count=$((count+1))
>
>      for i in $(seq 1 $subgroup_num); do
> @@ -113,8 +79,10 @@ attach_task()
>          pid="$ppid"
>      fi
>
> -    if ! attach_and_check "$pid" "$cur_path"; then
> +    if [ "$cgroup_v" = "V2" ] && [ $cur_depth -eq $subgroup_depth ] || [ "$cgroup_v" = "V1" ]; then
> +        if ! attach_and_check "$pid" "$cur_path"; then
>              fail=1
> +        fi
>      fi
>
>      for i in $(seq 1 $subgroup_num); do
> @@ -123,46 +91,78 @@ attach_task()
>      done
>
>      if [ -n "$ppid" ]; then
> -        if ! attach_and_check "$pid" "$cur_path"; then
> -            fail=1
> +        if [ "$cgroup_v" = "V2" ] && [ $cur_depth -eq $subgroup_depth ] || [ "$cgroup_v" = "V1" ]; then
> +            if ! attach_and_check "$pid" "$cur_path"; then
> +                fail=1
> +            fi
>          fi
>      fi
>  }
>
> -start_path="$mount_point/ltp"
> +setup()
> +{
> +    export TMPFILE=./tmp_tasks.$$
> +    count=0
> +    collected_pids=
> +
> +    case $subgroup_num in
> +        ''|*[!0-9]*) usage_and_exit "Number of subgroups must be possitive integer";;
> +        *) ;;
> +    esac
> +
> +    case $subgroup_depth in
> +        ''|*[!0-9]*) usage_and_exit "Depth of the subgroup tree must be possitive integer";;
> +        *) ;;
> +    esac
> +
> +    case $attach_operation in
> +        'none'|'one'|'each');;
> +        *) usage_and_exit "Invalid attach operation: $attach_operation";;
> +    esac
> +
> +    common_setup
> +}
>
> -tst_resm TINFO "Creating subgroups ..."
> +cleanup()
> +{
> +    common_cleanup
> +}
>
> -build_subgroups "$start_path" 0
> +test()
> +{
> +    tst_res TINFO "Creating subgroups ..."
>
> -tst_resm TINFO "... mkdired $count times"
> +    build_subgroups "$start_path" 0
>
> -case $attach_operation in
> -"one" )
> -    cgroup_fj_proc &
> -    pid=$!
> +    tst_res TINFO "... mkdired $count times"
>
> -    tst_resm TINFO "Moving one task around"
> -    attach_task "$start_path" 0 "$pid"
> -    ROD kill -9 "$pid"
> -    wait "$pid"
> -    ;;
> -"each" )
> -    tst_resm TINFO "Attaching task to each subgroup"
> -    attach_task "$start_path" 0
> -    for pid in $collected_pids; do
> +    case $attach_operation in
> +    "one" )
> +        cgroup_fj_proc &
> +        pid=$!
> +
> +        tst_res TINFO "Moving one task around"
> +        attach_task "$start_path" 0 "$pid"
>          ROD kill -9 "$pid"
>          wait "$pid"
> -    done
> -    ;;
> -*  )
> -    ;;
> -esac
> -
> -if [ -n "$fail" ]; then
> -    tst_resm TFAIL "Attaching tasks failed!"
> -else
> -    tst_resm TPASS "All done!"
> -fi
> -
> -tst_exit
> +        ;;
> +    "each" )
> +        tst_res TINFO "Attaching task to each subgroup"
> +        attach_task "$start_path" 0
> +        for pid in $collected_pids; do
> +            ROD kill -9 "$pid"
> +            wait "$pid"
> +        done
> +        ;;
> +    *  )
> +        ;;
> +    esac
> +
> +    if [ -n "$fail" ]; then
> +        tst_res TFAIL "Attaching tasks failed!"
> +    else
> +        tst_res TPASS "All done!"
> +    fi
> +}
> +
> +tst_run
> --
> 2.32.0
>


-- 
Regards,
Li Wang



More information about the ltp mailing list