When we select CPUs for the scheduler tests we pick up all siblings from given core. On some nodes in the CI these threads may have IDs in ranges that simply overflow during the shift operation ( > 62). To avoid this, use a list instead of a mask. Also, deny all threads with IDs > 127 as DPDK doesn't support them anyway. Signed-off-by: Michal Berger <michal.berger@intel.com> Change-Id: Ib83649a762cb31a460184d1e0b594c112aea2bab Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16604 Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com> Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
66 lines
1.6 KiB
Bash
Executable File
66 lines
1.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
# Copyright (C) 2020 Intel Corporation
|
|
# All rights reserved.
|
|
#
|
|
|
|
testdir=$(readlink -f "$(dirname "$0")")
|
|
rootdir=$(readlink -f "$testdir/../../")
|
|
|
|
source "$rootdir/test/common/autotest_common.sh"
|
|
source "$testdir/common.sh"
|
|
|
|
trap 'killprocess "$spdk_pid"' EXIT
|
|
|
|
thread_stats() {
|
|
local thread
|
|
local busy_threads=0
|
|
|
|
get_thread_stats
|
|
|
|
# Simply verify if threads stay idle
|
|
for thread in "${!thread_map[@]}"; do
|
|
if ((idle[thread] < busy[thread])); then
|
|
printf 'Waiting for %s to become idle\n' "${thread_map[thread]}"
|
|
((++busy_threads))
|
|
elif ((idle[thread] > busy[thread])); then
|
|
printf '%s is idle\n' "${thread_map[thread]}"
|
|
fi
|
|
done
|
|
|
|
((busy_threads == 0))
|
|
}
|
|
|
|
idle() {
|
|
local reactor_framework
|
|
local reactors thread
|
|
local thread_cpumask
|
|
local threads
|
|
|
|
exec_under_dynamic_scheduler "${SPDK_APP[@]}" -m "$spdk_cpumask" --main-core "$spdk_main_core"
|
|
|
|
# The expectation here is that when SPDK app is idle the following is true:
|
|
# - all threads are assigned to main lcore
|
|
# - threads are not being moved between lcores
|
|
|
|
xtrace_disable
|
|
while ((samples++ < 5)); do
|
|
cpumask=0
|
|
reactor_framework=$(rpc_cmd framework_get_reactors | jq -r '.reactors[]')
|
|
threads=($(
|
|
jq -r "select(.lcore == $spdk_main_core) | .lw_threads[].name" <<< "$reactor_framework"
|
|
))
|
|
|
|
for thread in "${threads[@]}"; do
|
|
thread_cpumask=0x$(jq -r "select(.lcore == $spdk_main_core) | .lw_threads[] | select(.name == \"$thread\") | .cpumask" <<< "$reactor_framework")
|
|
printf 'SPDK cpumask: %s Thread %s cpumask: %s\n' "$spdk_cpumask" "$thread" "$thread_cpumask"
|
|
done
|
|
|
|
thread_stats
|
|
done
|
|
|
|
xtrace_restore
|
|
}
|
|
|
|
idle
|