Fix: Wrong assumption about possible CPUs
authorOlivier Dion <odion@efficios.com>
Tue, 14 Feb 2023 19:35:34 +0000 (14:35 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 16 Mar 2023 15:05:39 +0000 (11:05 -0400)
cpuset is not necessary contiguous.  Thus, we need to parse
/sys/devices/system/cpu/posssible correctly.

Also, the `get_exposed_cpus_list' utility functions is required for
taskset-ting on the correct CPUs available to the test environment.

Change-Id: I062ce8d311ff0e8c4b757fe6f36387e3007cfa27
Signed-off-by: Olivier Dion <odion@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
tests/regression/tools/snapshots/ust_test
tests/utils/utils.sh

index 26cfbf88e9a8961a696eb128261d7d045be700c8..d1ba07071636001d51a99e6cb7cfa43d62ea607e 100755 (executable)
@@ -298,14 +298,15 @@ function test_ust_local_snapshot_small_overwrite_buffers ()
 function test_ust_local_snapshot_max_size ()
 {
        local possible_cpus
-       local online_cpus
+       local cpus_list
        local subbuf_size
        local subbuf_count
        local snapshot_max_size
        local channel_max_size_per_cpu
 
+       IFS=" " read -r -a cpus_list <<< "$(get_exposed_cpus_list)"
+
        possible_cpus=$(get_possible_cpus_count)
-       online_cpus=$(conf_proc_count)
        subbuf_size=$(getconf PAGE_SIZE)
        subbuf_count=8
        snapshot_max_size=$((subbuf_size*possible_cpus))
@@ -325,9 +326,10 @@ function test_ust_local_snapshot_max_size ()
 
        # Fill all ring-buffers of the channel; assuming event size of at least one
        # byte
-       for cpu in $(seq "$online_cpus");
+       for cpu in "${cpus_list[@]}";
        do
-               taskset --cpu-list $((cpu-1)) "$TESTAPP_BIN" \
+               diag "setting affinity to $cpu"
+               taskset --cpu-list "$cpu" "$TESTAPP_BIN" \
                        --iter "$channel_max_size_per_cpu"
        done
        diag "Filled channel ring-buffers"
index 78bee0c63d16f1ea14433c5b5e61724f5db45c4a..a6f9a8b6c05cad9b0d5c6dd20ccc5d64792d3b71 100644 (file)
@@ -217,33 +217,69 @@ function randstring()
 # Helpers for get_possible_cpus.
 function get_possible_cpus_count_from_sysfs_possible_mask()
 {
-       local max_possible_cpu_id=$(cut -d '-' -f 2 < /sys/devices/system/cpu/possible)
-       echo $((max_possible_cpu_id+1))
+       local max_possible_cpu_id
+
+       # The Awk script extracts the highest CPU id from the possible CPU
+       # mask. Assuming a numerical order, a field separator '-' and a record
+       # separator ','. The last value parsed is the highest id.
+       if [ -f /sys/devices/system/cpu/possible ]; then
+               max_possible_cpu_id=$(awk -F '-' 'BEGIN { RS = ","} { last = $NF } END { printf("%d\n", last) }' \
+                                     /sys/devices/system/cpu/possible)
+               echo "$((max_possible_cpu_id+1))"
+       else
+               echo "0"
+       fi
 }
 
+# This is a fallback if the possible CPU mask is not available. This will not
+# take into account unplugged CPUs.
 function get_max_cpus_count_from_sysfs_cpu_directories()
 {
-       local max_possible_cpu_id= \
-               $(find /sys/devices/system/cpu/ -mindepth 1 -maxdepth 1 -regex ".+cpu[0-9]+" | \
-                 sed -e 's/cpu//g' | \
-                 awk -F '/' '{ if ($NF > N) N = $NF } END { print N }')
-       echo $((max_possible_cpu_id+1))
+       local max_possible_cpu_id=0
+       local current_cpu_id
+
+       for i in /sys/devices/system/cpu/cpu[0-9]*; do
+               current_cpu_id="${i#/sys/devices/system/cpu/cpu}"
+               if [ "$current_cpu_id" -gt "$max_possible_cpu_id" ]; then
+                       max_possible_cpu_id="$current_cpu_id"
+               fi
+       done
+
+       echo "$((max_possible_cpu_id+1))"
 }
 
 # Return the number of possible CPUs.
 function get_possible_cpus_count()
 {
-       local possible_cpus_count=$(get_possible_cpus_count_from_sysfs_possible_mask)
+       local possible_cpus_count
+       possible_cpus_count=$(get_possible_cpus_count_from_sysfs_possible_mask)
 
-       if [ $? -ne 0 ]; then
+       if [ "$possible_cpus_count" -eq "0" ]; then
+               local configured_cpus_count
+               configured_cpus_count=$(getconf _NPROCESSORS_CONF)
                possible_cpus_count=$(get_max_cpus_count_from_sysfs_cpu_directories)
-               local configured_cpus_count=$(getconf _NPROCESSORS_CONF)
-               possible_cpus_count=$(($configured_cpus_count > $possible_cpus_count \
-                                                             ? $configured_cpus_count \
-                                                             : $possible_cpus_count))
+               possible_cpus_count=$((configured_cpus_count > possible_cpus_count \
+                                                            ? configured_cpus_count \
+                                                            : possible_cpus_count))
        fi
 
-       echo $possible_cpus_count
+       echo "$possible_cpus_count"
+}
+
+# Return the list of exposed CPU.
+#
+# NOTE! Use it like so:
+#
+# IFS=" " read -r -a VARIABLE <<< "$(get_exposed_cpus_list)"
+function get_exposed_cpus_list()
+{
+       local list=()
+
+       for i in /sys/devices/system/cpu/cpu[0-9]*; do
+               list+=("${i#/sys/devices/system/cpu/cpu}")
+       done
+
+       echo "${list[@]}"
 }
 
 # Return the number of _configured_ CPUs.
This page took 0.028229 seconds and 4 git commands to generate.