Spdk/test/scheduler/interrupt.sh
paul luse eb53c23236 add (c) and SPDX header to bash files as needed
per Intel policy to include file commit date using git cmd
below.  The policy does not apply to non-Intel (C) notices.

git log --follow -C90% --format=%ad --date default <file> | tail -1

and then pull just the year from the result.

Intel copyrights were not added to files where Intel either had
no contribution ot the contribution lacked substance (ie license
header updates, formatting changes, etc)

For intel copyrights added, --follow and -C95% were used.

Signed-off-by: paul luse <paul.e.luse@intel.com>
Change-Id: I2ef86976095b88a9bf5b1003e59f3943cd6bbe4c
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15209
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Krzysztof Karas <krzysztof.karas@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
2022-11-29 08:27:51 +00:00

81 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (C) 2021 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
declare -a cpus=()
declare -a cpus_to_collect=()
fold_list_onto_array cpus $(parse_cpu_list <(echo "$spdk_cpus_csv"))
# Normalize the indexes
cpus=("${cpus[@]}")
interrupt() {
local busy_cpus
local cpu thread
local reactor_framework
cpus_to_collect=("${cpus[@]}")
collect_cpu_idle
# Verify that each cpu, except the main cpu, has no threads assigned
reactor_framework=$(rpc_cmd framework_get_reactors | jq -r '.reactors[]')
for cpu in "${cpus[@]:1}"; do
[[ -z $(jq -r "select(.lcore == $cpu) | .lw_threads[].id" <<< "$reactor_framework") ]]
done
# Standard scenario - spdk app is idle, all cpus, except the main cpu, should be
# switched into interrupt mode. main cpu should remain busy, all remaining cpus
# should become idle.
for cpu in "${!is_idle[@]}"; do
if ((cpu == spdk_main_core)); then
((is_idle[cpu] == 0)) # main cpu must not be idle
fi
if ((cpu != spdk_main_core)); then
((is_idle[cpu] == 1)) # all cpus except the main cpu must be idle
fi
done
# select 3 cpus except the main one
busy_cpus=("${cpus[@]:1:3}") threads=()
# Create busy thread on each of the selected cpus, then verify if given cpu has become busy
# and that newly created thread was assigned to a proper lcore.
for cpu in "${busy_cpus[@]}"; do
threads[cpu]=$(create_thread -n "thread$cpu" -m "$(mask_cpus "$cpu")" -a 100) cpus_to_collect=("$cpu")
collect_cpu_idle
reactor_framework=$(rpc_cmd framework_get_reactors | jq -r '.reactors[]')
[[ -n $(jq -r "select(.lcore == $cpu) | .lw_threads[] | select(.name == \"thread$cpu\")" <<< "$reactor_framework") ]]
((is_idle[cpu] == 0))
done
# Make all the threads idle and verify if their cpus have become idle as well and if they were
# moved away out of their lcores.
for cpu in "${!threads[@]}"; do
active_thread "${threads[cpu]}" 0
cpus_to_collect=("$cpu")
collect_cpu_idle
reactor_framework=$(rpc_cmd framework_get_reactors | jq -r '.reactors[]')
[[ -z $(jq -r "select(.lcore == $cpu) | .lw_threads[].id" <<< "$reactor_framework") ]]
[[ -n $(jq -r "select(.lcore == $spdk_main_core) | .lw_threads[] | select(.name == \"thread$cpu\")" <<< "$reactor_framework") ]]
((is_idle[cpu] == 1))
done
for cpu in "${!threads[@]}"; do
destroy_thread "${threads[cpu]}"
done
}
exec_under_dynamic_scheduler "$scheduler" -m "$spdk_cpumask" --main-core "$spdk_main_core"
interrupt