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