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

selftest/cgroup: Clean up and restructure test_cpuset_prs.sh

Cleaning up the test_cpuset_prs.sh script and restructure some of the
functions so that a new test matrix with a different cgroup directory
structure can be added in the next patch.

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
b2b2b4d0 65046b5e

+156 -101
+156 -101
tools/testing/selftests/cgroup/test_cpuset_prs.sh
··· 88 88 # If isolated CPUs have been reserved at boot time (as shown in 89 89 # cpuset.cpus.isolated), these isolated CPUs should be outside of CPUs 0-8 90 90 # that will be used by this script for testing purpose. If not, some of 91 - # the tests may fail incorrectly. These pre-isolated CPUs should stay in 92 - # an isolated state throughout the testing process for now. 91 + # the tests may fail incorrectly. Wait a bit and retry again just in case 92 + # these isolated CPUs are leftover from previous run and have just been 93 + # cleaned up earlier in this script. 94 + # 95 + # These pre-isolated CPUs should stay in an isolated state throughout the 96 + # testing process for now. 93 97 # 94 98 BOOT_ISOLCPUS=$(cat $CGROUP2/cpuset.cpus.isolated) 99 + [[ -n "$BOOT_ISOLCPUS" ]] && { 100 + sleep 0.5 101 + BOOT_ISOLCPUS=$(cat $CGROUP2/cpuset.cpus.isolated) 102 + } 95 103 if [[ -n "$BOOT_ISOLCPUS" ]] 96 104 then 97 105 [[ $(echo $BOOT_ISOLCPUS | sed -e "s/[,-].*//") -le 8 ]] && 98 106 skip_test "Pre-isolated CPUs ($BOOT_ISOLCPUS) overlap CPUs to be tested" 99 107 echo "Pre-isolated CPUs: $BOOT_ISOLCPUS" 100 108 fi 109 + 101 110 cleanup() 102 111 { 103 112 online_cpus 104 113 cd $CGROUP2 105 - rmdir A1/A2/A3 A1/A2 A1 B1 > /dev/null 2>&1 106 - rmdir test > /dev/null 2>&1 114 + rmdir A1/A2/A3 A1/A2 A1 B1 test/A1 test/B1 test > /dev/null 2>&1 107 115 [[ -n "$SCHED_DEBUG" ]] && 108 116 echo "$SCHED_DEBUG" > /sys/kernel/debug/sched/verbose 109 117 } ··· 181 173 # 182 174 # Cgroup test hierarchy 183 175 # 184 - # root -- A1 -- A2 -- A3 185 - # +- B1 176 + # root 177 + # | 178 + # +------+------+ 179 + # | | 180 + # A1 B1 181 + # | 182 + # A2 183 + # | 184 + # A3 186 185 # 187 186 # P<v> = set cpus.partition (0:member, 1:root, 2:isolated) 188 187 # C<l> = add cpu-list to cpuset.cpus 189 188 # X<l> = add cpu-list to cpuset.cpus.exclusive 190 189 # S<p> = use prefix in subtree_control 191 190 # T = put a task into cgroup 191 + # CX<l> = add cpu-list to both cpuset.cpus and cpuset.cpus.exclusive 192 192 # O<c>=<v> = Write <v> to CPU online file of <c> 193 193 # 194 194 # ECPUs - effective CPUs of cpusets ··· 469 453 PFILE=$CGRP/cpuset.cpus.partition 470 454 CFILE=$CGRP/cpuset.cpus 471 455 XFILE=$CGRP/cpuset.cpus.exclusive 472 - S=$(expr substr $CMD 1 1) 473 - if [[ $S = S ]] 474 - then 475 - PREFIX=${CMD#?} 456 + case $CMD in 457 + S*) PREFIX=${CMD#?} 476 458 COMM="echo ${PREFIX}${CTRL} > $SFILE" 477 459 eval $COMM $REDIRECT 478 - elif [[ $S = X ]] 479 - then 460 + ;; 461 + X*) 480 462 CPUS=${CMD#?} 481 463 COMM="echo $CPUS > $XFILE" 482 464 eval $COMM $REDIRECT 483 - elif [[ $S = C ]] 484 - then 485 - CPUS=${CMD#?} 465 + ;; 466 + CX*) 467 + CPUS=${CMD#??} 468 + COMM="echo $CPUS > $CFILE; echo $CPUS > $XFILE" 469 + eval $COMM $REDIRECT 470 + ;; 471 + C*) CPUS=${CMD#?} 486 472 COMM="echo $CPUS > $CFILE" 487 473 eval $COMM $REDIRECT 488 - elif [[ $S = P ]] 489 - then 490 - VAL=${CMD#?} 474 + ;; 475 + P*) VAL=${CMD#?} 491 476 case $VAL in 492 477 0) VAL=member 493 478 ;; ··· 503 486 esac 504 487 COMM="echo $VAL > $PFILE" 505 488 eval $COMM $REDIRECT 506 - elif [[ $S = O ]] 507 - then 508 - VAL=${CMD#?} 489 + ;; 490 + O*) VAL=${CMD#?} 509 491 write_cpu_online $VAL 510 - elif [[ $S = T ]] 511 - then 512 - COMM="echo 0 > $TFILE" 492 + ;; 493 + T*) COMM="echo 0 > $TFILE" 513 494 eval $COMM $REDIRECT 514 - fi 495 + ;; 496 + *) echo "Unknown command: $CMD" 497 + exit 1 498 + ;; 499 + esac 515 500 RET=$? 516 501 [[ $RET -ne 0 ]] && { 517 502 [[ -n "$SHOWERR" ]] && { ··· 551 532 } 552 533 553 534 # 554 - # Return 1 if the list of effective cpus isn't the same as the initial list. 535 + # Remove all the test cgroup directories 555 536 # 556 537 reset_cgroup_states() 557 538 { 558 539 echo 0 > $CGROUP2/cgroup.procs 559 540 online_cpus 560 - rmdir A1/A2/A3 A1/A2 A1 B1 > /dev/null 2>&1 561 - pause 0.02 562 - set_ctrl_state . R- 563 - pause 0.01 541 + rmdir $RESET_LIST > /dev/null 2>&1 564 542 } 565 543 566 544 dump_states() 567 545 { 568 - for DIR in . A1 A1/A2 A1/A2/A3 B1 546 + for DIR in $CGROUP_LIST 569 547 do 570 548 CPUS=$DIR/cpuset.cpus 571 549 ECPUS=$DIR/cpuset.cpus.effective ··· 582 566 } 583 567 584 568 # 569 + # Set the actual cgroup directory into $CGRP_DIR 570 + # $1 - cgroup name 571 + # 572 + set_cgroup_dir() 573 + { 574 + CGRP_DIR=$1 575 + [[ $CGRP_DIR = A2 ]] && CGRP_DIR=A1/A2 576 + [[ $CGRP_DIR = A3 ]] && CGRP_DIR=A1/A2/A3 577 + [[ $CGRP_DIR = c11 ]] && CGRP_DIR=p1/c11 578 + [[ $CGRP_DIR = c12 ]] && CGRP_DIR=p1/c12 579 + [[ $CGRP_DIR = c21 ]] && CGRP_DIR=p2/c21 580 + [[ $CGRP_DIR = c22 ]] && CGRP_DIR=p2/c22 581 + } 582 + 583 + # 585 584 # Check effective cpus 586 585 # $1 - check string, format: <cgroup>:<cpu-list>[|<cgroup>:<cpu-list>]* 587 586 # ··· 607 576 do 608 577 set -- $(echo $CHK | sed -e "s/:/ /g") 609 578 CGRP=$1 610 - CPUS=$2 579 + EXPECTED_CPUS=$2 580 + ACTUAL_CPUS= 611 581 if [[ $CGRP = X* ]] 612 582 then 613 583 CGRP=${CGRP#X} ··· 616 584 else 617 585 FILE=cpuset.cpus.effective 618 586 fi 619 - [[ $CGRP = A2 ]] && CGRP=A1/A2 620 - [[ $CGRP = A3 ]] && CGRP=A1/A2/A3 621 - [[ -e $CGRP/$FILE ]] || return 1 622 - [[ $CPUS = $(cat $CGRP/$FILE) ]] || return 1 587 + set_cgroup_dir $CGRP 588 + [[ -e $CGRP_DIR/$FILE ]] || return 1 589 + ACTUAL_CPUS=$(cat $CGRP_DIR/$FILE) 590 + [[ $EXPECTED_CPUS = $ACTUAL_CPUS ]] || return 1 623 591 done 624 592 } 625 593 ··· 634 602 do 635 603 set -- $(echo $CHK | sed -e "s/:/ /g") 636 604 CGRP=$1 637 - CGRP_DIR=$CGRP 638 - STATE=$2 605 + EXPECTED_STATE=$2 639 606 FILE= 640 - EVAL=$(expr substr $STATE 2 2) 641 - [[ $CGRP = A2 ]] && CGRP_DIR=A1/A2 642 - [[ $CGRP = A3 ]] && CGRP_DIR=A1/A2/A3 607 + EVAL=$(expr substr $EXPECTED_STATE 2 2) 643 608 644 - case $STATE in 609 + set_cgroup_dir $CGRP 610 + case $EXPECTED_STATE in 645 611 P*) FILE=$CGRP_DIR/cpuset.cpus.partition 646 612 ;; 647 - *) echo "Unknown state: $STATE!" 613 + *) echo "Unknown state: $EXPECTED_STATE!" 648 614 exit 1 649 615 ;; 650 616 esac 651 - VAL=$(cat $FILE) 617 + ACTUAL_STATE=$(cat $FILE) 652 618 653 - case "$VAL" in 619 + case "$ACTUAL_STATE" in 654 620 member) VAL=0 655 621 ;; 656 622 root) VAL=1 ··· 672 642 [[ $VAL -eq 1 && $VERBOSE -gt 0 ]] && { 673 643 DOMS=$(cat $CGRP_DIR/cpuset.cpus.effective) 674 644 [[ -n "$DOMS" ]] && 675 - echo " [$CGRP] sched-domain: $DOMS" > $CONSOLE 645 + echo " [$CGRP_DIR] sched-domain: $DOMS" > $CONSOLE 676 646 } 677 647 done 678 648 return 0 ··· 695 665 # 696 666 check_isolcpus() 697 667 { 698 - EXPECT_VAL=$1 699 - ISOLCPUS= 668 + EXPECTED_ISOLCPUS=$1 669 + ISCPUS=${CGROUP2}/cpuset.cpus.isolated 670 + ISOLCPUS=$(cat $ISCPUS) 700 671 LASTISOLCPU= 701 672 SCHED_DOMAINS=/sys/kernel/debug/sched/domains 702 - ISCPUS=${CGROUP2}/cpuset.cpus.isolated 703 - if [[ $EXPECT_VAL = . ]] 673 + if [[ $EXPECTED_ISOLCPUS = . ]] 704 674 then 705 - EXPECT_VAL= 706 - EXPECT_VAL2= 707 - elif [[ $(expr $EXPECT_VAL : ".*|.*") > 0 ]] 675 + EXPECTED_ISOLCPUS= 676 + EXPECTED_SDOMAIN= 677 + elif [[ $(expr $EXPECTED_ISOLCPUS : ".*|.*") > 0 ]] 708 678 then 709 - set -- $(echo $EXPECT_VAL | sed -e "s/|/ /g") 710 - EXPECT_VAL=$1 711 - EXPECT_VAL2=$2 679 + set -- $(echo $EXPECTED_ISOLCPUS | sed -e "s/|/ /g") 680 + EXPECTED_ISOLCPUS=$2 681 + EXPECTED_SDOMAIN=$1 712 682 else 713 - EXPECT_VAL2=$EXPECT_VAL 683 + EXPECTED_SDOMAIN=$EXPECTED_ISOLCPUS 714 684 fi 715 685 716 686 # ··· 719 689 # to make appending those CPUs easier. 720 690 # 721 691 [[ -n "$BOOT_ISOLCPUS" ]] && { 722 - EXPECT_VAL=${EXPECT_VAL:+${EXPECT_VAL},}${BOOT_ISOLCPUS} 723 - EXPECT_VAL2=${EXPECT_VAL2:+${EXPECT_VAL2},}${BOOT_ISOLCPUS} 692 + EXPECTED_ISOLCPUS=${EXPECTED_ISOLCPUS:+${EXPECTED_ISOLCPUS},}${BOOT_ISOLCPUS} 693 + EXPECTED_SDOMAIN=${EXPECTED_SDOMAIN:+${EXPECTED_SDOMAIN},}${BOOT_ISOLCPUS} 724 694 } 725 695 726 696 # 727 697 # Check cpuset.cpus.isolated cpumask 728 698 # 729 - [[ "$EXPECT_VAL2" != "$ISOLCPUS" ]] && { 699 + [[ "$EXPECTED_ISOLCPUS" != "$ISOLCPUS" ]] && { 730 700 # Take a 50ms pause and try again 731 701 pause 0.05 732 702 ISOLCPUS=$(cat $ISCPUS) 733 703 } 734 - [[ "$EXPECT_VAL2" != "$ISOLCPUS" ]] && return 1 704 + [[ "$EXPECTED_ISOLCPUS" != "$ISOLCPUS" ]] && return 1 735 705 ISOLCPUS= 706 + EXPECTED_ISOLCPUS=$EXPECTED_SDOMAIN 736 707 737 708 # 738 709 # Use the sched domain in debugfs to check isolated CPUs, if available ··· 767 736 done 768 737 [[ "$ISOLCPUS" = *- ]] && ISOLCPUS=${ISOLCPUS}$LASTISOLCPU 769 738 770 - [[ "$EXPECT_VAL" = "$ISOLCPUS" ]] 739 + [[ "$EXPECTED_SDOMAIN" = "$ISOLCPUS" ]] 771 740 } 772 741 773 742 test_fail() ··· 805 774 } 806 775 807 776 # 777 + # Check state transition test result 778 + # $1 - Test number 779 + # $2 - Expected effective CPU values 780 + # $3 - Expected partition states 781 + # $4 - Expected isolated CPUs 782 + # 783 + check_test_results() 784 + { 785 + _NR=$1 786 + _ECPUS="$2" 787 + _PSTATES="$3" 788 + _ISOLCPUS="$4" 789 + 790 + [[ -n "$_ECPUS" && "$_ECPUS" != . ]] && { 791 + check_effective_cpus $_ECPUS 792 + [[ $? -ne 0 ]] && test_fail $_NR "effective CPU" \ 793 + "Cgroup $CGRP: expected $EXPECTED_CPUS, got $ACTUAL_CPUS" 794 + } 795 + 796 + [[ -n "$_PSTATES" && "$_PSTATES" != . ]] && { 797 + check_cgroup_states $_PSTATES 798 + [[ $? -ne 0 ]] && test_fail $_NR states \ 799 + "Cgroup $CGRP: expected $EXPECTED_STATE, got $ACTUAL_STATE" 800 + } 801 + 802 + # Compare the expected isolated CPUs with the actual ones, 803 + # if available 804 + [[ -n "$_ISOLCPUS" ]] && { 805 + check_isolcpus $_ISOLCPUS 806 + [[ $? -ne 0 ]] && { 807 + [[ -n "$BOOT_ISOLCPUS" ]] && _ISOLCPUS=${_ISOLCPUS},${BOOT_ISOLCPUS} 808 + test_fail $_NR "isolated CPU" \ 809 + "Expect $_ISOLCPUS, get $ISOLCPUS instead" 810 + } 811 + } 812 + reset_cgroup_states 813 + # 814 + # Check to see if effective cpu list changes 815 + # 816 + _NEWLIST=$(cat $CGROUP2/cpuset.cpus.effective) 817 + RETRY=0 818 + while [[ $_NEWLIST != $CPULIST && $RETRY -lt 8 ]] 819 + do 820 + # Wait a bit longer & recheck a few times 821 + pause 0.02 822 + ((RETRY++)) 823 + _NEWLIST=$(cat $CGROUP2/cpuset.cpus.effective) 824 + done 825 + [[ $_NEWLIST != $CPULIST ]] && { 826 + echo "Effective cpus changed to $_NEWLIST after test $_NR!" 827 + exit 1 828 + } 829 + null_isolcpus_check 830 + [[ $VERBOSE -gt 0 ]] && echo "Test $I done." 831 + } 832 + 833 + # 808 834 # Run cpuset state transition test 809 835 # $1 - test matrix name 810 836 # ··· 873 785 { 874 786 TEST=$1 875 787 CONTROLLER=cpuset 788 + CGROUP_LIST=". A1 A1/A2 A1/A2/A3 B1" 789 + RESET_LIST="A1/A2/A3 A1/A2 A1 B1" 876 790 I=0 877 791 eval CNT="\${#$TEST[@]}" 878 792 ··· 914 824 915 825 [[ $RETVAL -ne $RESULT ]] && test_fail $I result 916 826 917 - [[ -n "$ECPUS" && "$ECPUS" != . ]] && { 918 - check_effective_cpus $ECPUS 919 - [[ $? -ne 0 ]] && test_fail $I "effective CPU" 920 - } 921 - 922 - [[ -n "$STATES" && "$STATES" != . ]] && { 923 - check_cgroup_states $STATES 924 - [[ $? -ne 0 ]] && test_fail $I states 925 - } 926 - 927 - # Compare the expected isolated CPUs with the actual ones, 928 - # if available 929 - [[ -n "$ICPUS" ]] && { 930 - check_isolcpus $ICPUS 931 - [[ $? -ne 0 ]] && { 932 - [[ -n "$BOOT_ISOLCPUS" ]] && ICPUS=${ICPUS},${BOOT_ISOLCPUS} 933 - test_fail $I "isolated CPU" \ 934 - "Expect $ICPUS, get $ISOLCPUS instead" 935 - } 936 - } 937 - reset_cgroup_states 938 - # 939 - # Check to see if effective cpu list changes 940 - # 941 - NEWLIST=$(cat cpuset.cpus.effective) 942 - RETRY=0 943 - while [[ $NEWLIST != $CPULIST && $RETRY -lt 8 ]] 944 - do 945 - # Wait a bit longer & recheck a few times 946 - pause 0.02 947 - ((RETRY++)) 948 - NEWLIST=$(cat cpuset.cpus.effective) 949 - done 950 - [[ $NEWLIST != $CPULIST ]] && { 951 - echo "Effective cpus changed to $NEWLIST after test $I!" 952 - exit 1 953 - } 954 - null_isolcpus_check 955 - [[ $VERBOSE -gt 0 ]] && echo "Test $I done." 827 + check_test_results $I "$ECPUS" "$STATES" "$ICPUS" 956 828 ((I++)) 957 829 done 958 830 echo "All $I tests of $TEST PASSED." ··· 984 932 echo $$ > $CGROUP2/cgroup.procs 985 933 [[ -d A1 ]] && rmdir A1 986 934 null_isolcpus_check 935 + pause 0.05 987 936 } 988 937 989 938 # ··· 1050 997 else 1051 998 echo "Inotify test PASSED" 1052 999 fi 1000 + echo member > cpuset.cpus.partition 1001 + echo "" > cpuset.cpus 1053 1002 } 1054 1003 1055 1004 trap cleanup 0 2 3 6