Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftest/cgroup: Add a remote partition transition test to test_cpuset_prs.sh

The current cgroup directory layout for running the partition state
transition tests is mainly suitable for testing local partitions as
well as with a mix of local and remote partitions. It is not that
suitable for doing extensive remote partition and nested remote/local
partition testing.

Add a new set of remote partition tests REMOTE_TEST_MATRIX with another
cgroup directory structure more tailored for remote partition testing
to provide better code coverage.

Also add a few new test cases as well as adjusting existig ones for
the original TEST_MATRIX.

Signed-off-by: Waiman Long <longman@redhat.com>
Signed-off-by: Tejun Heo <tj@kernel.org>

authored by

Waiman Long and committed by
Tejun Heo
e8a457b7 b2b2b4d0

+143 -11
+143 -11
tools/testing/selftests/cgroup/test_cpuset_prs.sh
··· 112 112 online_cpus 113 113 cd $CGROUP2 114 114 rmdir A1/A2/A3 A1/A2 A1 B1 test/A1 test/B1 test > /dev/null 2>&1 115 + rmdir rtest/p1/c11 rtest/p1/c12 rtest/p2/c21 \ 116 + rtest/p2/c22 rtest/p1 rtest/p2 rtest > /dev/null 2>&1 115 117 [[ -n "$SCHED_DEBUG" ]] && 116 118 echo "$SCHED_DEBUG" > /sys/kernel/debug/sched/verbose 117 119 } ··· 225 223 " C0-1:P1 . . C2-3 S+:C4-5 . . . 0 A1:4-5" 226 224 " C0-1 . . C2-3:P1 . . . C2 0 " 227 225 " C0-1 . . C2-3:P1 . . . C4-5 0 B1:4-5" 228 - "C0-3:P1:S+ C2-3:P1 . . . . . . 0 A1:0-1|A2:2-3" 229 - "C0-3:P1:S+ C2-3:P1 . . C1-3 . . . 0 A1:1|A2:2-3" 230 - "C2-3:P1:S+ C3:P1 . . C3 . . . 0 A1:|A2:3 A1:P1|A2:P1" 226 + "C0-3:P1:S+ C2-3:P1 . . . . . . 0 A1:0-1|A2:2-3|XA2:2-3" 227 + "C0-3:P1:S+ C2-3:P1 . . C1-3 . . . 0 A1:1|A2:2-3|XA2:2-3" 228 + "C2-3:P1:S+ C3:P1 . . C3 . . . 0 A1:|A2:3|XA2:3 A1:P1|A2:P1" 231 229 "C2-3:P1:S+ C3:P1 . . C3 P0 . . 0 A1:3|A2:3 A1:P1|A2:P0" 232 230 "C2-3:P1:S+ C2:P1 . . C2-4 . . . 0 A1:3-4|A2:2" 233 231 "C2-3:P1:S+ C3:P1 . . C3 . . C0-2 0 A1:|B1:0-2 A1:P1|A2:P1" ··· 293 291 A1:P0|A2:P2|A3:P1 2" 294 292 " C0-4:X2-4:S+ C1-4:X2-4:S+:P2 C2-4:X4:P1 \ 295 293 . . X5 . . 0 A1:0-4|A2:1-4|A3:2-4 \ 296 - A1:P0|A2:P-2|A3:P-1" 294 + A1:P0|A2:P-2|A3:P-1 ." 297 295 " C0-4:X2-4:S+ C1-4:X2-4:S+:P2 C2-4:X4:P1 \ 298 296 . . . X1 . 0 A1:0-1|A2:2-4|A3:2-4 \ 299 297 A1:P0|A2:P2|A3:P-1 2-4" ··· 305 303 " C0-3:S+ C1-3:S+ C3 . X2-3 X2-3 T:P2:O3=0 . 0 A1:0-2|A2:1-2|A3:1-2 A1:P0|A3:P-2 3|" 306 304 307 305 # An invalidated remote partition cannot self-recover from hotplug 308 - " C0-3:S+ C1-3:S+ C2 . X2-3 X2-3 T:P2:O2=0 O2=1 0 A1:0-3|A2:1-3|A3:2 A1:P0|A3:P-2" 306 + " C0-3:S+ C1-3:S+ C2 . X2-3 X2-3 T:P2:O2=0 O2=1 0 A1:0-3|A2:1-3|A3:2 A1:P0|A3:P-2 ." 309 307 310 308 # cpus.exclusive.effective clearing test 311 309 " C0-3:S+ C1-3:S+ C2 . X2-3:X . . . 0 A1:0-3|A2:1-3|A3:2|XA1:" 312 310 313 311 # Invalid to valid remote partition transition test 314 - " C0-3:S+ C1-3 . . . X3:P2 . . 0 A1:0-3|A2:1-3|XA2: A2:P-2" 312 + " C0-3:S+ C1-3 . . . X3:P2 . . 0 A1:0-3|A2:1-3|XA2: A2:P-2 ." 315 313 " C0-3:S+ C1-3:X3:P2 316 314 . . X2-3 P2 . . 0 A1:0-2|A2:3|XA2:3 A2:P2 3" 317 315 ··· 320 318 " C1-3:S+:P2 X4:P2 . . . X3:P2 . . 0 A1:1-2|XA1:1-3|A2:3:XA2:3 A1:P2|A2:P2 1-3" 321 319 " C0-3:P2 . . C4-6 C0-4 . . . 0 A1:0-4|B1:4-6 A1:P-2|B1:P0" 322 320 " C0-3:P2 . . C4-6 C0-4:C0-3 . . . 0 A1:0-3|B1:4-6 A1:P2|B1:P0 0-3" 323 - " C0-3:P2 . . C3-5:C4-5 . . . . 0 A1:0-3|B1:4-5 A1:P2|B1:P0 0-3" 324 321 325 322 # Local partition invalidation tests 326 323 " C0-3:X1-3:S+:P2 C1-3:X2-3:S+:P2 C2-3:X3:P2 \ ··· 335 334 # cpus_allowed/exclusive_cpus update tests 336 335 " C0-3:X2-3:S+ C1-3:X2-3:S+ C2-3:X2-3 \ 337 336 . X:C4 . P2 . 0 A1:4|A2:4|XA2:|XA3:|A3:4 \ 338 - A1:P0|A3:P-2" 337 + A1:P0|A3:P-2 ." 339 338 " C0-3:X2-3:S+ C1-3:X2-3:S+ C2-3:X2-3 \ 340 339 . X1 . P2 . 0 A1:0-3|A2:1-3|XA1:1|XA2:|XA3:|A3:2-3 \ 341 - A1:P0|A3:P-2" 340 + A1:P0|A3:P-2 ." 342 341 " C0-3:X2-3:S+ C1-3:X2-3:S+ C2-3:X2-3 \ 343 342 . . X3 P2 . 0 A1:0-2|A2:1-2|XA2:3|XA3:3|A3:3 \ 344 343 A1:P0|A3:P2 3" ··· 386 385 # A partition root with non-partition root parent is invalid| but it 387 386 # can be made valid if its parent becomes a partition root too. 388 387 " C0-1:S+ C1 . C2-3 . P2 . . 0 A1:0-1|A2:1 A1:P0|A2:P-2" 389 - " C0-1:S+ C1:P2 . C2-3 P1 . . . 0 A1:0|A2:1 A1:P1|A2:P2" 388 + " C0-1:S+ C1:P2 . C2-3 P1 . . . 0 A1:0|A2:1 A1:P1|A2:P2 0-1|1" 390 389 391 390 # A non-exclusive cpuset.cpus change will invalidate partition and its siblings 392 391 " C0-1:P1 . . C2-3 C0-2 . . . 0 A1:0-2|B1:2-3 A1:P-1|B1:P0" ··· 406 405 # affect cpuset.cpus.exclusive.effective. 407 406 " C1-4:X3:S+ C1:X3 . . . C . . 0 A2:1-4|XA2:3" 408 407 408 + # cpuset.cpus can contain CPUs that overlap a sibling cpuset with cpus.exclusive 409 + # but creating a local partition out of it is not allowed. Similarly and change 410 + # in cpuset.cpus of a local partition that overlaps sibling exclusive CPUs will 411 + # invalidate it. 412 + " CX1-4:S+ CX2-4:P2 . C5-6 . . . P1 0 A1:1|A2:2-4|B1:5-6|XB1:5-6 \ 413 + A1:P0|A2:P2:B1:P1 2-4" 414 + " CX1-4:S+ CX2-4:P2 . C3-6 . . . P1 0 A1:1|A2:2-4|B1:5-6 \ 415 + A1:P0|A2:P2:B1:P-1 2-4" 416 + " CX1-4:S+ CX2-4:P2 . C5-6 . . . P1:C3-6 0 A1:1|A2:2-4|B1:5-6 \ 417 + A1:P0|A2:P2:B1:P-1 2-4" 418 + 409 419 # old-A1 old-A2 old-A3 old-B1 new-A1 new-A2 new-A3 new-B1 fail ECPUs Pstate ISOLCPUS 410 420 # ------ ------ ------ ------ ------ ------ ------ ------ ---- ----- ------ -------- 411 421 # Failure cases: ··· 429 417 430 418 # cpuset.cpus cannot be a subset of sibling cpuset.cpus.exclusive 431 419 " C0-3 . . C4-5 X3-5 . . . 1 A1:0-3|B1:4-5" 420 + ) 421 + 422 + # 423 + # Cpuset controller remote partition test matrix. 424 + # 425 + # Cgroup test hierarchy 426 + # 427 + # root 428 + # | 429 + # rtest (cpuset.cpus.exclusive=1-7) 430 + # | 431 + # +------+------+ 432 + # | | 433 + # p1 p2 434 + # +--+--+ +--+--+ 435 + # | | | | 436 + # c11 c12 c21 c22 437 + # 438 + # REMOTE_TEST_MATRIX uses the same notational convention as TEST_MATRIX. 439 + # Only CPUs 1-7 should be used. 440 + # 441 + REMOTE_TEST_MATRIX=( 442 + # old-p1 old-p2 old-c11 old-c12 old-c21 old-c22 443 + # new-p1 new-p2 new-c11 new-c12 new-c21 new-c22 ECPUs Pstate ISOLCPUS 444 + # ------ ------ ------- ------- ------- ------- ----- ------ -------- 445 + " X1-3:S+ X4-6:S+ X1-2 X3 X4-5 X6 \ 446 + . . P2 P2 P2 P2 c11:1-2|c12:3|c21:4-5|c22:6 \ 447 + c11:P2|c12:P2|c21:P2|c22:P2 1-6" 448 + " CX1-4:S+ . X1-2:P2 C3 . . \ 449 + . . . C3-4 . . p1:3-4|c11:1-2|c12:3-4 \ 450 + p1:P0|c11:P2|c12:P0 1-2" 451 + " CX1-4:S+ . X1-2:P2 . . . \ 452 + X2-4 . . . . . p1:1,3-4|c11:2 \ 453 + p1:P0|c11:P2 2" 454 + " CX1-5:S+ . X1-2:P2 X3-5:P1 . . \ 455 + X2-4 . . . . . p1:1,5|c11:2|c12:3-4 \ 456 + p1:P0|c11:P2|c12:P1 2" 457 + " CX1-4:S+ . X1-2:P2 X3-4:P1 . . \ 458 + . . X2 . . . p1:1|c11:2|c12:3-4 \ 459 + p1:P0|c11:P2|c12:P1 2" 460 + # p1 as member, will get its effective CPUs from its parent rtest 461 + " CX1-4:S+ . X1-2:P2 X3-4:P1 . . \ 462 + . . X1 CX2-4 . . p1:5-7|c11:1|c12:2-4 \ 463 + p1:P0|c11:P2|c12:P1 1" 464 + " CX1-4:S+ X5-6:P1:S+ . . . . \ 465 + . . X1-2:P2 X4-5:P1 . X1-7:P2 p1:3|c11:1-2|c12:4:c22:5-6 \ 466 + p1:P0|p2:P1|c11:P2|c12:P1|c22:P2 \ 467 + 1-2,4-6|1-2,5-6" 432 468 ) 433 469 434 470 # ··· 962 902 STATES=${11} 963 903 ICPUS=${12} 964 904 965 - set_ctrl_state_noerr B1 $OLD_B1 966 905 set_ctrl_state_noerr A1 $OLD_A1 967 906 set_ctrl_state_noerr A1/A2 $OLD_A2 968 907 set_ctrl_state_noerr A1/A2/A3 $OLD_A3 908 + set_ctrl_state_noerr B1 $OLD_B1 909 + 969 910 RETVAL=0 970 911 set_ctrl_state A1 $NEW_A1; ((RETVAL += $?)) 971 912 set_ctrl_state A1/A2 $NEW_A2; ((RETVAL += $?)) ··· 978 917 check_test_results $I "$ECPUS" "$STATES" "$ICPUS" 979 918 ((I++)) 980 919 done 920 + echo "All $I tests of $TEST PASSED." 921 + } 922 + 923 + # 924 + # Run cpuset remote partition state transition test 925 + # $1 - test matrix name 926 + # 927 + run_remote_state_test() 928 + { 929 + TEST=$1 930 + CONTROLLER=cpuset 931 + [[ -d rtest ]] || mkdir rtest 932 + cd rtest 933 + echo +cpuset > cgroup.subtree_control 934 + echo "1-7" > cpuset.cpus 935 + echo "1-7" > cpuset.cpus.exclusive 936 + CGROUP_LIST=".. . p1 p2 p1/c11 p1/c12 p2/c21 p2/c22" 937 + RESET_LIST="p1/c11 p1/c12 p2/c21 p2/c22 p1 p2" 938 + I=0 939 + eval CNT="\${#$TEST[@]}" 940 + 941 + reset_cgroup_states 942 + console_msg "Running remote partition state transition test ..." 943 + 944 + while [[ $I -lt $CNT ]] 945 + do 946 + echo "Running test $I ..." > $CONSOLE 947 + [[ $VERBOSE -gt 1 ]] && { 948 + echo "" 949 + eval echo \${$TEST[$I]} 950 + } 951 + eval set -- "\${$TEST[$I]}" 952 + OLD_p1=$1 953 + OLD_p2=$2 954 + OLD_c11=$3 955 + OLD_c12=$4 956 + OLD_c21=$5 957 + OLD_c22=$6 958 + NEW_p1=$7 959 + NEW_p2=$8 960 + NEW_c11=$9 961 + NEW_c12=${10} 962 + NEW_c21=${11} 963 + NEW_c22=${12} 964 + ECPUS=${13} 965 + STATES=${14} 966 + ICPUS=${15} 967 + 968 + set_ctrl_state_noerr p1 $OLD_p1 969 + set_ctrl_state_noerr p2 $OLD_p2 970 + set_ctrl_state_noerr p1/c11 $OLD_c11 971 + set_ctrl_state_noerr p1/c12 $OLD_c12 972 + set_ctrl_state_noerr p2/c21 $OLD_c21 973 + set_ctrl_state_noerr p2/c22 $OLD_c22 974 + 975 + RETVAL=0 976 + set_ctrl_state p1 $NEW_p1 ; ((RETVAL += $?)) 977 + set_ctrl_state p2 $NEW_p2 ; ((RETVAL += $?)) 978 + set_ctrl_state p1/c11 $NEW_c11; ((RETVAL += $?)) 979 + set_ctrl_state p1/c12 $NEW_c12; ((RETVAL += $?)) 980 + set_ctrl_state p2/c21 $NEW_c21; ((RETVAL += $?)) 981 + set_ctrl_state p2/c22 $NEW_c22; ((RETVAL += $?)) 982 + 983 + [[ $RETVAL -ne 0 ]] && test_fail $I result 984 + 985 + check_test_results $I "$ECPUS" "$STATES" "$ICPUS" 986 + ((I++)) 987 + done 988 + cd .. 989 + rmdir rtest 981 990 echo "All $I tests of $TEST PASSED." 982 991 } 983 992 ··· 1187 1056 1188 1057 trap cleanup 0 2 3 6 1189 1058 run_state_test TEST_MATRIX 1059 + run_remote_state_test REMOTE_TEST_MATRIX 1190 1060 test_isolated 1191 1061 test_inotify 1192 1062 echo "All tests PASSED."