From: Guopeng Zhang <guopeng.zhang@linux.dev>
To: cgroups@vger.kernel.org, longman@redhat.com, ridong.chen@linux.dev
Cc: tj@kernel.org, hannes@cmpxchg.org, mkoutny@suse.com,
shuah@kernel.org, linux-kernel@vger.kernel.org,
linux-kselftest@vger.kernel.org,
Guopeng Zhang <zhangguopeng@kylinos.cn>
Subject: [PATCH v2 4/6] selftests/cgroup: Add tests for housekeeping CPU return to isolated parents
Date: Fri, 28 Aug 2026 17:56:41 +0800 [thread overview]
Message-ID: <20260828095643.13395-5-guopeng.zhang@linux.dev> (raw)
In-Reply-To: <20260828095643.13395-1-guopeng.zhang@linux.dev>
From: Guopeng Zhang <zhangguopeng@kylinos.cn>
Return the last housekeeping CPU from a root child to an isolated parent.
Check that the parent becomes invalid and releases its CPUs instead of
adding the returned CPU to the isolated mask.
Repeat the test with two isolated ancestors and check that the outermost
isolated partition is invalidated.
Signed-off-by: Guopeng Zhang <zhangguopeng@kylinos.cn>
---
.../selftests/cgroup/test_cpuset_prs.sh | 146 ++++++++++++++++++
1 file changed, 146 insertions(+)
diff --git a/tools/testing/selftests/cgroup/test_cpuset_prs.sh b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
index ae27245e90bb..72fe5ce48eff 100755
--- a/tools/testing/selftests/cgroup/test_cpuset_prs.sh
+++ b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
@@ -1222,6 +1222,30 @@ test_boot_isolated()
echo "$TEST_NAME test PASSED."
}
+# Return success if CPU $2 is present in cpulist $1.
+cpulist_contains()
+{
+ local CPULIST_ARG=$1
+ local CPU_ARG=$2
+ local ITEM FIRST LAST
+ local OLD_IFS=$IFS
+
+ IFS=,
+ for ITEM in $CPULIST_ARG
+ do
+ FIRST=${ITEM%-*}
+ LAST=${ITEM#*-}
+ [[ $ITEM != *-* ]] && LAST=$FIRST
+ if [[ $CPU_ARG -ge $FIRST && $CPU_ARG -le $LAST ]]
+ then
+ IFS=$OLD_IFS
+ return 0
+ fi
+ done
+ IFS=$OLD_IFS
+ return 1
+}
+
#
# A parent's type and CPU-mask changes must check only CPUs owned directly by
# the parent, not a boot-isolated CPU owned by a valid child partition.
@@ -1274,6 +1298,127 @@ test_child_owned_cpus()
echo "$TEST_NAME test PASSED."
}
+#
+# Returning the last housekeeping CPU to an isolated parent must invalidate
+# the isolated partition instead of adding that CPU to the isolated mask.
+#
+test_housekeeping_cpu_return()
+{
+ TEST_NAME="Housekeeping CPU return"
+ NOHZ_FILE=/sys/devices/system/cpu/nohz_full
+ [[ -r $NOHZ_FILE ]] || {
+ echo "$TEST_NAME test SKIPPED: no nohz_full state"
+ return 0
+ }
+ NOHZ_CPUS=$(cat $NOHZ_FILE)
+ [[ -n "$NOHZ_CPUS" && "$NOHZ_CPUS" != "(null)" ]] || {
+ echo "$TEST_NAME test SKIPPED: no nohz_full CPUs"
+ return 0
+ }
+
+ HK_CPU=
+ HK_COUNT=0
+ TYPE_CPUS=()
+ for ((CPU=0; CPU < NR_CPUS; CPU++))
+ do
+ CPU_ONLINE=/sys/devices/system/cpu/cpu${CPU}/online
+ [[ ! -e $CPU_ONLINE || $(cat $CPU_ONLINE) -eq 1 ]] || continue
+ cpulist_contains "$BOOT_CPUS" $CPU && continue
+ if cpulist_contains "$NOHZ_CPUS" $CPU
+ then
+ [[ ${#TYPE_CPUS[@]} -lt 3 ]] && TYPE_CPUS+=("$CPU")
+ else
+ HK_CPU=$CPU
+ ((HK_COUNT++))
+ fi
+ done
+
+ [[ $HK_COUNT -eq 1 && ${#TYPE_CPUS[@]} -ge 2 ]] || {
+ echo "$TEST_NAME test SKIPPED: requires one full housekeeping CPU"
+ return 0
+ }
+ echo "Running $TEST_NAME test ..."
+
+ cd $CGROUP2/test
+ echo member > cpuset.cpus.partition
+ echo +cpuset > cgroup.subtree_control
+ echo $HK_CPU,${TYPE_CPUS[0]},${TYPE_CPUS[1]} > cpuset.cpus
+ test_partition root
+ mkdir A1
+ cd A1
+ echo $HK_CPU > cpuset.cpus
+ test_partition root
+ cd ..
+ test_partition isolated
+ cd A1
+ test_partition member
+ cd ..
+ grep -q '^isolated invalid (partition config conflicts with housekeeping setup)$' \
+ cpuset.cpus.partition || {
+ echo "Isolated parent remained valid after housekeeping CPU return"
+ exit 1
+ }
+ [[ $(cat $CGROUP2/cpuset.cpus.effective) = "$CPULIST" ]] || {
+ echo "Housekeeping CPU return did not release the partition CPUs"
+ exit 1
+ }
+ check_isolcpus "." || {
+ echo "Housekeeping CPU was added to the isolated mask"
+ exit 1
+ }
+ rmdir A1
+ echo member > cpuset.cpus.partition
+ echo "" > cpuset.cpus
+
+ if [[ ${#TYPE_CPUS[@]} -lt 3 ]]
+ then
+ echo "Nested $TEST_NAME test SKIPPED: requires three nohz_full CPUs"
+ cd $CGROUP2
+ echo "$TEST_NAME test PASSED."
+ return 0
+ fi
+
+ # Repeat the check with two isolated ancestors.
+ echo $HK_CPU,${TYPE_CPUS[0]},${TYPE_CPUS[1]},${TYPE_CPUS[2]} > cpuset.cpus
+ test_partition root
+ mkdir A1
+ cd A1
+ echo $HK_CPU,${TYPE_CPUS[1]},${TYPE_CPUS[2]} > cpuset.cpus
+ test_partition root
+ echo +cpuset > cgroup.subtree_control
+ mkdir A2
+ cd A2
+ echo $HK_CPU > cpuset.cpus
+ test_partition root
+ cd ..
+ test_partition isolated
+ cd ..
+ test_partition isolated
+ cd A1/A2
+ test_partition member
+ cd ../..
+ grep -q '^isolated invalid (partition config conflicts with housekeeping setup)$' \
+ cpuset.cpus.partition || {
+ echo "Outermost isolated partition remained valid after housekeeping CPU return"
+ exit 1
+ }
+ [[ $(cat $CGROUP2/cpuset.cpus.effective) = "$CPULIST" ]] || {
+ echo "Nested housekeeping CPU return did not release the partition CPUs"
+ exit 1
+ }
+ check_isolcpus "." || {
+ echo "Nested housekeeping CPU return added the CPU to the isolated mask"
+ exit 1
+ }
+ rmdir A1/A2
+ echo member > A1/cpuset.cpus.partition
+ rmdir A1
+ echo member > cpuset.cpus.partition
+ echo "" > cpuset.cpus
+ cd $CGROUP2
+ echo "$TEST_NAME test PASSED."
+}
+
#
# Wait for inotify event for the given file and read it
# $1: cgroup file to wait for
@@ -1347,5 +1492,6 @@ run_remote_state_test REMOTE_TEST_MATRIX
test_isolated
test_boot_isolated
test_child_owned_cpus
+test_housekeeping_cpu_return
test_inotify
echo "All tests PASSED."
--
2.43.0
next prev parent reply other threads:[~2026-08-28 9:57 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-28 9:56 [PATCH v2 0/6] cgroup/cpuset: Fix partition type transitions Guopeng Zhang
2026-08-28 9:56 ` [PATCH v2 1/6] cgroup/cpuset: Respect child CPU ownership in type changes Guopeng Zhang
2026-08-28 9:56 ` [PATCH v2 2/6] selftests/cgroup: Add tests for type-change isolation accounting Guopeng Zhang
2026-08-28 9:56 ` [PATCH v2 3/6] selftests/cgroup: Add tests for type changes with child-owned CPUs Guopeng Zhang
2026-08-28 9:56 ` Guopeng Zhang [this message]
2026-08-28 9:56 ` [PATCH v2 5/6] cgroup/cpuset: Release CPUs when type-change validation fails Guopeng Zhang
2026-08-28 9:56 ` [PATCH v2 6/6] selftests/cgroup: Add CPU release tests for type-change validation failures 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=20260828095643.13395-5-guopeng.zhang@linux.dev \
--to=guopeng.zhang@linux.dev \
--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 \
--cc=zhangguopeng@kylinos.cn \
/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®