tracing: selftests: Extend hotplug testing for trace remotes

The hotplug testing only tries reading a trace remote buffer, loaded
before a CPU is offline. Extend this testing to cover:

  * A trace remote buffer loaded after a CPU is offline.
  * A trace remote buffer loaded before a CPU is online.

Because of these added test cases, move the hotplug testing into a
separate hotplug.tc file.

Acked-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
Link: https://patch.msgid.link/20260401045100.3394299-3-vdonnefort@google.com
Signed-off-by: Marc Zyngier <maz@kernel.org>
This commit is contained in:
Vincent Donnefort
2026-04-01 05:51:00 +01:00
committed by Marc Zyngier
parent ce47b798ed
commit ec07906bdc
5 changed files with 115 additions and 55 deletions

View File

@@ -24,12 +24,21 @@ setup_remote_test()
assert_loaded()
{
grep -q "(loaded)" buffer_size_kb
grep -q "(loaded)" buffer_size_kb || return 1
}
assert_unloaded()
{
grep -q "(unloaded)" buffer_size_kb
grep -q "(unloaded)" buffer_size_kb || return 1
}
reload_remote()
{
echo 0 > tracing_on
clear_trace
assert_unloaded
echo 1 > tracing_on
assert_loaded
}
dump_trace_pipe()
@@ -79,10 +88,12 @@ get_cpu_ids()
sed -n 's/^processor\s*:\s*\([0-9]\+\).*/\1/p' /proc/cpuinfo
}
get_page_size() {
get_page_size()
{
sed -ne 's/^.*data.*size:\([0-9][0-9]*\).*/\1/p' events/header_page
}
get_selftest_event_size() {
get_selftest_event_size()
{
sed -ne 's/^.*field:.*;.*size:\([0-9][0-9]*\);.*/\1/p' events/*/selftest/format | awk '{s+=$1} END {print s}'
}

View File

@@ -0,0 +1,88 @@
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# description: Test trace remote read with an offline CPU
# requires: remotes/test
. $TEST_DIR/remotes/functions
hotunplug_one_cpu()
{
[ "$(get_cpu_ids | wc -l)" -ge 2 ] || return 1
for cpu in $(get_cpu_ids); do
echo 0 > /sys/devices/system/cpu/cpu$cpu/online || return 1
break
done
echo $cpu
}
# Check non-consuming and consuming read
check_read()
{
for i in $(seq 1 8); do
echo $i > write_event
done
check_trace 1 8 trace
output=$(dump_trace_pipe)
check_trace 1 8 $output
rm $output
}
test_hotplug()
{
echo 0 > trace
assert_loaded
#
# Test a trace buffer containing an offline CPU
#
cpu=$(hotunplug_one_cpu) || exit_unsupported
trap "echo 1 > /sys/devices/system/cpu/cpu$cpu/online" EXIT
check_read
#
# Test a trace buffer with a missing CPU
#
reload_remote
check_read
#
# Test a trace buffer with a CPU added later
#
echo 1 > /sys/devices/system/cpu/cpu$cpu/online
trap "" EXIT
assert_loaded
check_read
# Test if the ring-buffer for the newly added CPU is both writable and
# readable
for i in $(seq 1 8); do
taskset -c $cpu echo $i > write_event
done
cd per_cpu/cpu$cpu/
check_trace 1 8 trace
output=$(dump_trace_pipe)
check_trace 1 8 $output
rm $output
cd -
}
if [ -z "$SOURCE_REMOTE_TEST" ]; then
set -e
setup_remote_test
test_hotplug
fi

View File

@@ -0,0 +1,11 @@
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# description: Test hypervisor trace read with an offline CPU
# requires: remotes/hypervisor/write_event
SOURCE_REMOTE_TEST=1
. $TEST_DIR/remotes/hotplug.tc
set -e
setup_remote "hypervisor"
test_hotplug

View File

@@ -58,11 +58,7 @@ test_trace()
#
# Ensure the writer is not on the reader page by reloading the buffer
echo 0 > tracing_on
echo 0 > trace
assert_unloaded
echo 1 > tracing_on
assert_loaded
reload_remote
# Ensure ring-buffer overflow by emitting events from the same CPU
for cpu in $(get_cpu_ids); do
@@ -96,27 +92,6 @@ test_trace()
cd - > /dev/null
done
#
# Test with hotplug
#
[ "$(get_cpu_ids | wc -l)" -ge 2 ] || return 0
echo 0 > trace
for cpu in $(get_cpu_ids); do
echo 0 > /sys/devices/system/cpu/cpu$cpu/online || return 0
break
done
for i in $(seq 1 8); do
echo $i > write_event
done
check_trace 1 8 trace
echo 1 > /sys/devices/system/cpu/cpu$cpu/online
}
if [ -z "$SOURCE_REMOTE_TEST" ]; then

View File

@@ -92,31 +92,6 @@ test_trace_pipe()
rm $output
cd - > /dev/null
done
#
# Test interaction with hotplug
#
[ "$(get_cpu_ids | wc -l)" -ge 2 ] || return 0
echo 0 > trace
for cpu in $(get_cpu_ids); do
echo 0 > /sys/devices/system/cpu/cpu$cpu/online || return 0
break
done
for i in $(seq 1 8); do
echo $i > write_event
done
output=$(dump_trace_pipe)
check_trace 1 8 $output
rm $output
echo 1 > /sys/devices/system/cpu/cpu$cpu/online
}
if [ -z "$SOURCE_REMOTE_TEST" ]; then