xref: /spdk/test/interrupt/reactor_set_interrupt.sh (revision eb53c23236cccb6b698b7ca70ee783da1c574b5f)
1ac0c36d7SLiu Xiaodong#!/usr/bin/env bash
2*eb53c232Spaul luse#  SPDX-License-Identifier: BSD-3-Clause
3*eb53c232Spaul luse#  Copyright (C) 2021 Intel Corporation
4*eb53c232Spaul luse#  All rights reserved.
5*eb53c232Spaul luse#
6ac0c36d7SLiu Xiaodongtestdir=$(readlink -f $(dirname $0))
7ac0c36d7SLiu Xiaodongrootdir=$(readlink -f $testdir/../..)
8ac0c36d7SLiu Xiaodongsource $rootdir/test/common/autotest_common.sh
9ac0c36d7SLiu Xiaodongsource $testdir/interrupt_common.sh
10ac0c36d7SLiu Xiaodong
117610bc38SKonrad Sztyberexport PYTHONPATH=$PYTHONPATH:$rootdir/examples/interrupt_tgt
12ac0c36d7SLiu Xiaodong
13ac0c36d7SLiu Xiaodongfunction reactor_set_intr_mode() {
14ac0c36d7SLiu Xiaodong	local spdk_pid=$1
15ac0c36d7SLiu Xiaodong	local without_thd=$2
16ac0c36d7SLiu Xiaodong
17ac0c36d7SLiu Xiaodong	thd0_ids=($(reactor_get_thread_ids $r0_mask))
18ac0c36d7SLiu Xiaodong	thd2_ids=($(reactor_get_thread_ids $r2_mask))
19ac0c36d7SLiu Xiaodong
20c9c7c281SJosh Soref	# Number of thd0_ids shouldn't be zero
21ac0c36d7SLiu Xiaodong	if [[ ${#thd0_ids[*]} -eq 0 ]]; then
22ac0c36d7SLiu Xiaodong		echo "spdk_thread is expected in reactor 0."
23ac0c36d7SLiu Xiaodong		return 1
24ac0c36d7SLiu Xiaodong	else
25ac0c36d7SLiu Xiaodong		echo "spdk_thread ids are ${thd0_ids[*]} on reactor0."
26ac0c36d7SLiu Xiaodong	fi
27ac0c36d7SLiu Xiaodong
28ac0c36d7SLiu Xiaodong	# CPU utilization of reactor 0~2 should be idle
29ac0c36d7SLiu Xiaodong	for i in {0..2}; do
30ac0c36d7SLiu Xiaodong		reactor_is_idle $spdk_pid $i
31ac0c36d7SLiu Xiaodong	done
32ac0c36d7SLiu Xiaodong
33a03ded65SLiu Xiaodong	if [ "$without_thd"x != x ]; then
34ac0c36d7SLiu Xiaodong		# Schedule all spdk_threads to reactor 1
356e7b3e4cSSebastian Brzezinka		for i in "${thd0_ids[@]}"; do
36ac0c36d7SLiu Xiaodong			$rpc_py thread_set_cpumask -i $i -m $r1_mask
37ac0c36d7SLiu Xiaodong		done
386e7b3e4cSSebastian Brzezinka		for i in "${thd2_ids[@]}"; do
39ac0c36d7SLiu Xiaodong			$rpc_py thread_set_cpumask -i $i -m $r1_mask
40ac0c36d7SLiu Xiaodong		done
41ac0c36d7SLiu Xiaodong	fi
42ac0c36d7SLiu Xiaodong	# Set reactor 0 and 2 to be poll mode
43ac0c36d7SLiu Xiaodong	$rpc_py --plugin interrupt_plugin reactor_set_interrupt_mode 0 -d
44ac0c36d7SLiu Xiaodong	$rpc_py --plugin interrupt_plugin reactor_set_interrupt_mode 2 -d
45ac0c36d7SLiu Xiaodong	# CPU utilization of reactor 0 and 2 should be busy
46ac0c36d7SLiu Xiaodong	for i in 0 2; do
47ac0c36d7SLiu Xiaodong		reactor_is_busy $spdk_pid $i
48ac0c36d7SLiu Xiaodong	done
49ac0c36d7SLiu Xiaodong
50ac0c36d7SLiu Xiaodong	# Set reactor 2 back to intr mode
51ac0c36d7SLiu Xiaodong	$rpc_py --plugin interrupt_plugin reactor_set_interrupt_mode 2
52a03ded65SLiu Xiaodong	if [ "$without_thd"x != x ]; then
53ac0c36d7SLiu Xiaodong		# Schedule spdk_threads in thd2_ids back to reactor 2
546e7b3e4cSSebastian Brzezinka		for i in "${thd2_ids[@]}"; do
55ac0c36d7SLiu Xiaodong			$rpc_py thread_set_cpumask -i $i -m $r2_mask
56ac0c36d7SLiu Xiaodong		done
57ac0c36d7SLiu Xiaodong	fi
58ac0c36d7SLiu Xiaodong	# CPU utilization of reactor 2 should be idle
59ac0c36d7SLiu Xiaodong	reactor_is_idle $spdk_pid 2
60ac0c36d7SLiu Xiaodong
61ac0c36d7SLiu Xiaodong	# Set reactor 0 back to intr mode
62ac0c36d7SLiu Xiaodong	$rpc_py --plugin interrupt_plugin reactor_set_interrupt_mode 0
63a03ded65SLiu Xiaodong	if [ "$without_thd"x != x ]; then
64ac0c36d7SLiu Xiaodong		# Schedule spdk_threads in thd2_ids back to reactor 0
656e7b3e4cSSebastian Brzezinka		for i in "${thd0_ids[@]}"; do
66ac0c36d7SLiu Xiaodong			$rpc_py thread_set_cpumask -i $i -m $r0_mask
67ac0c36d7SLiu Xiaodong		done
68ac0c36d7SLiu Xiaodong	fi
69ac0c36d7SLiu Xiaodong	# CPU utilization of reactor 0 should be idle
70ac0c36d7SLiu Xiaodong	reactor_is_idle $spdk_pid 0
71ac0c36d7SLiu Xiaodong
72ac0c36d7SLiu Xiaodong	return 0
73ac0c36d7SLiu Xiaodong}
74ac0c36d7SLiu Xiaodong
75ac0c36d7SLiu Xiaodongfunction reactor_set_mode_without_threads() {
76ac0c36d7SLiu Xiaodong	reactor_set_intr_mode $1 "without_thd"
77ac0c36d7SLiu Xiaodong	return 0
78ac0c36d7SLiu Xiaodong}
79ac0c36d7SLiu Xiaodong
80ac0c36d7SLiu Xiaodongfunction reactor_set_mode_with_threads() {
81ac0c36d7SLiu Xiaodong	reactor_set_intr_mode $1
82ac0c36d7SLiu Xiaodong	return 0
83ac0c36d7SLiu Xiaodong}
84ac0c36d7SLiu Xiaodong
85ac0c36d7SLiu Xiaodong# Set reactors with intr_tgt without spdk_thread
86ac0c36d7SLiu Xiaodongstart_intr_tgt
87ac0c36d7SLiu Xiaodongsetup_bdev_mem
88ac0c36d7SLiu Xiaodongsetup_bdev_aio
89ac0c36d7SLiu Xiaodong
90ac0c36d7SLiu Xiaodongreactor_set_mode_without_threads $intr_tgt_pid
91ac0c36d7SLiu Xiaodong
92ac0c36d7SLiu Xiaodongtrap - SIGINT SIGTERM EXIT
93ac0c36d7SLiu Xiaodongkillprocess $intr_tgt_pid
94ac0c36d7SLiu Xiaodongcleanup
95ac0c36d7SLiu Xiaodong
96ac0c36d7SLiu Xiaodong# Set reactors with intr_tgt with spdk_thread
97ac0c36d7SLiu Xiaodongstart_intr_tgt
98ac0c36d7SLiu Xiaodongsetup_bdev_mem
99ac0c36d7SLiu Xiaodongsetup_bdev_aio
100ac0c36d7SLiu Xiaodong
101ac0c36d7SLiu Xiaodongreactor_set_mode_with_threads $intr_tgt_pid
102ac0c36d7SLiu Xiaodong
103ac0c36d7SLiu Xiaodongtrap - SIGINT SIGTERM EXIT
104ac0c36d7SLiu Xiaodongkillprocess $intr_tgt_pid
105ac0c36d7SLiu Xiaodongcleanup
106