From dae3e20b8d1833803058974c4a023e812a26701c Mon Sep 17 00:00:00 2001 From: Kienan Stewart Date: Tue, 15 Aug 2023 11:50:16 -0400 Subject: [PATCH] Tests: use CPU ids from online ranges MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit test_tracefile_count could fail randomly on systems where there are CPUs present but not online. For example: $ cat /sys/devices/system/cpu/online 0-7 $ cat /sys/devices/system/cpu/present 0-39 When a CPU is present, it will have an entry in /sys/devices/system/cpu/cpuX for it's ID, and thus the test may pick that CPU's ID. However, a present CPU which is not online is not a valid target for taskset. In cases where `get_any_available_cpu` is used with task set, the tests could fail for a similar reason. This case can be somewhat less common, because it would return the numerically lowest CPU first; however, with online as follows cpu 0 isn't available and taskset fails. $ cat /sys/devices/system/cpu/online 18-19,135,142 $ cat /sys/devices/system/cpu/present 0-167 Change-Id: I06ac2e67495552f54765794b154acc9e8e9990ec Signed-off-by: Kienan Stewart Signed-off-by: Jérémie Galarneau --- tests/regression/tools/snapshots/ust_test | 6 ++--- .../tracefile-limits/test_tracefile_count | 21 +++------------- tests/utils/utils.sh | 25 +++++++++++++++++-- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/tests/regression/tools/snapshots/ust_test b/tests/regression/tools/snapshots/ust_test index 24f43aec6..0a68e2b73 100755 --- a/tests/regression/tools/snapshots/ust_test +++ b/tests/regression/tools/snapshots/ust_test @@ -212,7 +212,7 @@ function test_ust_local_snapshot_small_discard_buffers () OLDCPUSET=$(taskset -p $$) diag "Test local UST snapshots with small discard buffers" - taskset -p 0x1 $$ 1>/dev/null 2>&1 # CPU 0 only + taskset -c "$(get_any_available_cpu)" -p $$ 1>/dev/null 2>&1 create_lttng_session_no_output $SESSION_NAME enable_mmap_small_discard_ust_channel $SESSION_NAME $CHANNEL_NAME enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME $CHANNEL_NAME @@ -257,7 +257,7 @@ function test_ust_local_snapshot_small_overwrite_buffers () OLDCPUSET=$(taskset -p $$) diag "Test local UST snapshots with small overwrite buffers" - taskset -p 0x1 $$ 1>/dev/null 2>&1 # CPU 0 only + taskset -p "$(get_any_available_cpu)" $$ 1>/dev/null 2>&1 create_lttng_session_no_output $SESSION_NAME enable_mmap_small_overwrite_ust_channel $SESSION_NAME $CHANNEL_NAME enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME $CHANNEL_NAME @@ -304,7 +304,7 @@ function test_ust_local_snapshot_max_size () local snapshot_max_size local channel_max_size_per_cpu - IFS=" " read -r -a cpus_list <<< "$(get_exposed_cpus_list)" + IFS=" " read -r -a cpus_list <<< "$(get_online_cpus)" possible_cpus=$(get_possible_cpus_count) subbuf_size=$(getconf PAGE_SIZE) diff --git a/tests/regression/tools/tracefile-limits/test_tracefile_count b/tests/regression/tools/tracefile-limits/test_tracefile_count index 37d15905a..9d6c2d9a8 100755 --- a/tests/regression/tools/tracefile-limits/test_tracefile_count +++ b/tests/regression/tools/tracefile-limits/test_tracefile_count @@ -22,30 +22,15 @@ TRACEFILE_SIZE=$PAGE_SIZE source "$TESTDIR"/utils/utils.sh -NUM_CPUS=$(conf_proc_count) - if [ ! -x "$TESTAPP_BIN" ]; then BAIL_OUT "No UST events binary detected." fi function pick_random_cpuid () { - local cpuid=0 - - # On Linux pick a random available cpuid from sysfs - if [ -d "/sys/devices/system/cpu" ]; then - local cpuids=() - - for i in /sys/devices/system/cpu/cpu[0-9]*; do - cpuids+=("${i#/sys/devices/system/cpu/cpu}") - done - - cpuid=${cpuids[ $RANDOM % ${#cpuids[@]} ]} - else - cpuid=$((RANDOM % NUM_CPUS)) - fi - - echo $cpuid + local cpuids + read -r -a cpuids <<< "$(get_online_cpus)" + echo "${cpuids[ $RANDOM % ${#cpuids[@]} ]}" } function enable_lttng_channel_count_limit () diff --git a/tests/utils/utils.sh b/tests/utils/utils.sh index 89624a421..004e90948 100644 --- a/tests/utils/utils.sh +++ b/tests/utils/utils.sh @@ -130,6 +130,27 @@ function randstring() echo } +# Return a space-separated string of online CPU IDs, based on +# /sys/devices/system/cpu/online, or from 0 to nproc - 1 otherwise. +function get_online_cpus() +{ + local cpus=() + local range_re + if [ -f /sys/devices/system/cpu/online ]; then + range_re='([0-9]+)-([0-9]+)' + while read -r range ; do + if [[ "${range}" =~ ${range_re} ]] ; then + mapfile -t -O "${#cpus[*]}" cpus <<< $(seq "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}") + else + cpus+=("${range}") + fi + done < <(tr ',' $'\n' < /sys/devices/system/cpu/online) + else + read -r -a cpus <<< $(seq 0 $(( $(conf_proc_count) - 1 )) ) + fi + echo "${cpus[*]}" +} + # Helpers for get_possible_cpus. function get_possible_cpus_count_from_sysfs_possible_mask() { @@ -202,8 +223,8 @@ function get_exposed_cpus_list() # value, e.g. that it could be 0. function get_any_available_cpu() { - for cpu in /sys/devices/system/cpu/cpu[0-9]*; do - echo "${cpu#/sys/devices/system/cpu/cpu}" + for cpu in $(get_online_cpus); do + echo "${cpu}" break; done } -- 2.34.1