mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Guopeng Zhang <guopeng.zhang@linux.dev>
To: "Waiman Long" <longman@redhat.com>,
	"Ridong Chen" <ridong.chen@linux.dev>,
	"Tejun Heo" <tj@kernel.org>,
	"Johannes Weiner" <hannes@cmpxchg.org>,
	"Michal Koutný" <mkoutny@suse.com>,
	"Shuah Khan" <shuah@kernel.org>
Cc: cgroups@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-kselftest@vger.kernel.org, Hui Peng <benquike@gmail.com>
Subject: Re: [PATCH-next v2 5/6] selftests/cgroup: Add tests for housekeeping check
Date: Sun, 11 Oct 2026 16:48:20 +0800	[thread overview]
Message-ID: <c7bf4584-0a47-445b-af10-4b1a29e9cdec@linux.dev> (raw)
In-Reply-To: <20261010221938.243859-6-longman@redhat.com>



在 2026/10/11 06:19, Waiman Long 写道:
> Whenever a partition is enabled or the cpumask of a valid partition
> changes, a housekeeping check will be performed to ensure that the
> change won't violate the imposed housekeeping constraints. One of the
> constraints is that a boot-time isolated CPU will not be used to form
> a non-isolated root partition.  This requires the presence of boot-time
> isolated CPUs when a test is run.
> 
> The test_cpuset_prs.sh test script is now updated to run a set a
> special housekeeping check tests that will only be run if a suitable
> boot-time isolated CPU is present. This will enable us to detect bugs
> or regressions in the housekeeping checking code though a "isolcpus="
> boot parameter with CPUs beyond CPU 8 must be present.
> 
> Adding test to check for exhaustion of all the housekeeping CPUs is
> much harder and so will not be attempted at this time.
> 
> This patch also includes a minor fix to the REMOTE_TEST_MATRIX to avoid
> test failure when the -v option is used.
> 
> Signed-off-by: Waiman Long <longman@redhat.com>
> ---
>  .../selftests/cgroup/test_cpuset_prs.sh       | 109 ++++++++++++++----
>  1 file changed, 87 insertions(+), 22 deletions(-)
> 
> diff --git a/tools/testing/selftests/cgroup/test_cpuset_prs.sh b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> index 7efd5e645767..3d392e8c66aa 100755
> --- a/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> +++ b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> @@ -86,26 +86,37 @@ echo "" > test/cpuset.cpus
>  
>  #
>  # If isolated CPUs have been reserved at boot time (as shown in
> -# cpuset.cpus.isolated), these isolated CPUs should be outside of CPUs 0-8
> -# that will be used by this script for testing purpose. If not, some of
> -# the tests may fail incorrectly. Wait a bit and retry again just in case
> -# these isolated CPUs are leftover from previous run and have just been
> -# cleaned up earlier in this script.
> +# /sys/devices/system/cpu/isolated), these isolated CPUs should be outside of
> +# CPUs 0-8 that will be used by this script for testing purpose. If not, some
> +# of the tests may fail incorrectly.
>  #
> -# These pre-isolated CPUs should stay in an isolated state throughout the
> +# The current set of isolated CPUs (as shown in cpuset.cpus.isolated) should
> +# be the same as the boot value. If not, wait a bit and retry again just in
> +# case these isolated CPUs are leftover from previous run and have just been
> +# cleaned up earlier in this script. If they still don't match, we report an
> +# warning and skip the test.
> +#
> +# These boot isolated CPUs should stay in an isolated state throughout the
>  # testing process for now.
>  #
> -BOOT_ISOLCPUS=$(cat $CGROUP2/cpuset.cpus.isolated)
> +BOOT_ISOLCPUS=$(cat /sys/devices/system/cpu/isolated)
> +CURRENT_ISOLCPUS=$(cat $CGROUP2/cpuset.cpus.isolated)
> +FIRST_ISOLCPUS=
> +TEST_ISOLCPUS=
> +
>  [[ -n "$BOOT_ISOLCPUS" ]] && {
> +	FIRST_ISOLCPUS=$(echo $BOOT_ISOLCPUS | sed -e "s/[,-].*//")
> +	[[ $FIRST_ISOLCPUS -le 8 ]] &&
> +		skip_test "Boot-isolated CPUs ($BOOT_ISOLCPUS) overlap CPUs to be tested"
> +	echo "Boot-isolated CPUs: $BOOT_ISOLCPUS"
> +}
> +
> +[[ "$BOOT_ISOLCPUS" != "$CURRENT_ISOLCPUS" ]] && {
>  	sleep 0.5
> -	BOOT_ISOLCPUS=$(cat $CGROUP2/cpuset.cpus.isolated)
> +	CURRENT_ISOLCPUS=$(cat $CGROUP2/cpuset.cpus.isolated)
> +	[[ "$BOOT_ISOLCPUS" != "$CURRENT_ISOLCPUS" ]] &&
> +		skip_test "Current isolated CPUs ($CURRENT_ISOLCPUS) don't match boot isolated CPUs!"
>  }
> -if [[ -n "$BOOT_ISOLCPUS" ]]
> -then
> -	[[ $(echo $BOOT_ISOLCPUS | sed -e "s/[,-].*//") -le 8 ]] &&
> -		skip_test "Pre-isolated CPUs ($BOOT_ISOLCPUS) overlap CPUs to be tested"
> -	echo "Pre-isolated CPUs: $BOOT_ISOLCPUS"
> -fi
>  
>  cleanup()
>  {
> @@ -202,7 +213,7 @@ test_add_proc()
>  #
>  # ECPUs    - effective CPUs of cpusets
>  # Pstate   - partition root state
> -# ISOLCPUS - isolated CPUs (<icpus>[,<icpus2>])
> +# ISOLCPUS - isolated CPUs (<icpus>[,<icpus2>] or .)
>  #
>  # Note that if there are 2 fields in ISOLCPUS, the first one is for
>  # sched-debug matching which includes offline CPUs and single-CPU partitions
> @@ -444,6 +455,35 @@ TEST_MATRIX=(
>  	"   C0-3     .      .    C4-5   X3-5     .      .      .     1 A1:0-3|B1:4-5"
>  )
>  
> +# Test matrix with boot time isolated CPUs present for housekeeping check testing
> +ISOLCPUS_TEST_MATRIX=(
> +	#  old-A1 old-A2 old-A3 old-B1 new-A1 new-A2 new-A3 new-B1 fail ECPUs Pstate ISOLCPUS
> +	#  ------ ------ ------ ------ ------ ------ ------ ------ ---- ----- ------ --------
> +	# A local isolated partition containing boot isolated CPU cannot be
> +	# switched to root partition.
> +	" C1-2,I:P2  .      .      .      P1     .      .      .     0 A1:1-2,I A1:P-1 ."
> +
> +	# A remote isolated partition containing boot isolated CPU cannot be
> +	# switched to root partition.
> +	" X1-2,I CX1-2,I:P2 .      .       .    P1      .      .     0 A2:1-2,I A2:P-1 ."
> +
> +	# A local isolated partition with a boot isolated CPU distributed to a
> +	# child isolated partition also cannot be switched to a root partition.
> +	" C1-3,I:P2 C1,I:P2 .      .      P1     .      .      .     0 A1:1-3,I|A2:1,I A1:P-1|A2:P-2 ."
> +
> +	# A remote isolated partition with a boot isolated CPU distributed to a
> +	# child isolated partition also cannot be switched to a root partition.
> +	" X1-3,I C1-3,I:P2 C1,I:P2 .       .    P1      .      .     0 A2:1-3,I|A3:1,I A2:P-1|A3:P-2 ."
> +
> +	# The cpumask of a local root partition cannot be changed to include a
> +	# boot isolated CPU.
> +	" C1-2:P1    .      .      .     C2,I    .      .      .     0 A1:2,I A1:P-1 ."
> +
> +	# The cpumask of a remote root partition cannot be changed to include a
> +	# boot isolated CPU.
> +	" CX1-2,I  CX1-2:P1 .      .       .   CX2,I    .      .     0 A1:1-2,I|A2:2,I A2:P-1 ."
> +)

Could we add two invalid-root revival cases with an explicit exclusive
mask here? For example:

        # An invalid root must stay invalid when cpus grows but exclusive
        # still contains a boot isolated CPU.
        " CX1,I:P1        .  .  .  C1-2,I   .  .  .  0 A1:1-2,I A1:P-1 ."

        # Growing exclusive must not revive it either.
        " C1-2,I:X1,I:P1 .  .  .  X1-2,I   .  .  .  0 A1:1-2,I A1:P-1 ."

Thanks,
Guopeng

> +
>  #
>  # Cpuset controller remote partition test matrix.
>  #
> @@ -496,8 +536,8 @@ REMOTE_TEST_MATRIX=(
>  							 p1:P1|c11:P1|c12:P-1"
>  	# Narrowing cpuset.cpus to previously sibling-excluded CPUs should
>  	# not return CPUs that were never actually owned.
> -	"  C1-4:P1   .   C1-2:P1  C1-3:P2  .       .  \
> -	      .      .     .       C3      .       .     p1:4|c11:1-2|c12:3 \
> +	"  C1-5:P1   .   C1-2:P1  C1-3:P2  .       .  \
> +	      .      .     .       C3      .       .     p1:4-5|c11:1-2|c12:3 \
>  							 p1:P1|c11:P1|c12:P2 3"
>  	# Expanding cpuset.cpus to include a previously sibling-excluded CPU
>  	# after the sibling has become a member should correctly request it.
> @@ -541,6 +581,27 @@ write_cpu_online()
>  	pause 0.05
>  }
>  
> +#
> +# Set the CPUS values
> +#  $1 - the passed in cpu parameter
> +#
> +# The special ",I" suffix if present is being replaced by the first boot CPU
> +# and assigned to the "CPUS" variable when the TEST_ISOLCPUS flag is set.
> +# If not, the program will exit with an error.
> +#
> +set_cpus()
> +{
> +	local cpus=$1
> +	if [[ $(expr "$cpus" : .*,I) -gt 0 ]]
> +	then
> +		[[ -z "$TEST_ISOLCPUS" ]] &&
> +			skip_test "',I' added to non-isolcpus testing matrix!"
> +		CPUS=$(echo $cpus | sed -e "s/,I/,$FIRST_ISOLCPUS/")
> +	else
> +		CPUS=$cpus
> +	fi
> +}
> +
>  #
>  # Set controller state
>  #  $1 - cgroup directory
> @@ -575,16 +636,16 @@ set_ctrl_state()
>  		}
>  		case $CMD in
>  		    X*)
> -			CPUS=${CMD#?}
> +			set_cpus ${CMD#?}
>  			COMM="echo $CPUS > $XFILE"
>  			eval $COMM $REDIRECT
>  			;;
>  		    CX*)
> -			CPUS=${CMD#??}
> +			set_cpus ${CMD#??}
>  			COMM="echo $CPUS > $CFILE; echo $CPUS > $XFILE"
>  			eval $COMM $REDIRECT
>  			;;
> -		    C*) CPUS=${CMD#?}
> +		    C*) set_cpus ${CMD#?}
>  			COMM="echo $CPUS > $CFILE"
>  			eval $COMM $REDIRECT
>  			;;
> @@ -978,8 +1039,11 @@ run_state_test()
>  	I=0
>  	eval CNT="\${#$TEST[@]}"
>  
> +	# Skip isolcpus specific test matrix if FIRST_ISOLCPUS not defined
> +	[[ -n "$TEST_ISOLCPUS" && -z "$FIRST_ISOLCPUS" ]] && return
> +
>  	reset_cgroup_states
> -	console_msg "Running state transition test ..."
> +	console_msg "Running state transition test for $TEST ..."
>  
>  	while [[ $I -lt $CNT ]]
>  	do
> @@ -998,7 +1062,7 @@ run_state_test()
>  		NEW_A3=$7
>  		NEW_B1=$8
>  		RESULT=$9
> -		ECPUS=${10}
> +		ECPUS=$(echo ${10} | sed -e "s/,I/,${FIRST_ISOLCPUS}/g")
>  		STATES=${11}
>  		ICPUS=${12}
>  
> @@ -1284,6 +1348,7 @@ test_inotify()
>  trap cleanup 0 2 3 6
>  run_state_test TEST_MATRIX
>  run_remote_state_test REMOTE_TEST_MATRIX
> +TEST_ISOLCPUS=1 run_state_test ISOLCPUS_TEST_MATRIX
>  test_isolated
>  test_boot_isolated
>  test_inotify


  reply	other threads:[~2026-10-11  8:48 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-10 22:19 [PATCH-next v2 0/6] cgroup/cpuset: Fix various housekeeping check problems Waiman Long
2026-10-10 22:19 ` [PATCH-next v2 1/6] cgroup/cpuset: Consolidate isolated_cpus_can_update() into prstate_housekeeping_conflict() Waiman Long
2026-10-11  2:02   ` Ridong Chen
2026-10-11  5:49   ` Guopeng Zhang
2026-10-10 22:19 ` [PATCH-next v2 2/6] cgroup/cpuset: Consider all the exclusive CPUs when doing housekeeping check Waiman Long
2026-10-11  8:34   ` Guopeng Zhang
2026-10-10 22:19 ` [PATCH-next v2 3/6] cgroup/cpuset: Do housekeeping check before converting invalid partition to valid Waiman Long
2026-10-11  2:06   ` Ridong Chen
2026-10-11  6:04   ` Guopeng Zhang
2026-10-10 22:19 ` [PATCH-next v2 4/6] cgroup/cpuset: Properly disabling partition when partition state switching fails Waiman Long
2026-10-11  6:05   ` Guopeng Zhang
2026-10-10 22:19 ` [PATCH-next v2 5/6] selftests/cgroup: Add tests for housekeeping check Waiman Long
2026-10-11  8:48   ` Guopeng Zhang [this message]
2026-10-10 22:19 ` [PATCH-next v2 6/6] selftests/cgroup: Skip test_cpuset_prs.sh test if some required CPUs are offline Waiman Long
2026-10-11  9:00   ` Guopeng Zhang

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=c7bf4584-0a47-445b-af10-4b1a29e9cdec@linux.dev \
    --to=guopeng.zhang@linux.dev \
    --cc=benquike@gmail.com \
    --cc=cgroups@vger.kernel.org \
    --cc=hannes@cmpxchg.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=longman@redhat.com \
    --cc=mkoutny@suse.com \
    --cc=ridong.chen@linux.dev \
    --cc=shuah@kernel.org \
    --cc=tj@kernel.org \
    /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

all inboxes | Powered by JetHome®