xref: /spdk/scripts/perf/nvmf/set_xps_rxqs (revision a6dbe3721eb3b5990707fc3e378c95e505dd8ab5)
1#!/bin/bash
2# SPDX-License-Identifier: BSD-3-Clause
3# Copyright (C) 2021 Intel Corporation.
4#
5# Script to setup mechanism for Tx queue selection based on Rx queue(s) map.
6# This is done by configuring Rx queue(s) map per Tx queue via sysfs. This
7# Rx queue(s) map is used during selection of Tx queue in
8# data path (net/core/dev.c:get_xps_queue).
9#
10# typical usage is (as root):
11# set_xps_rxqs <ethX>
12#
13# to get help:
14# set_xps_rxqs
15
16iface=$1
17
18if [ -z "$iface" ]; then
19	echo "Usage: $0 <interface>"
20	exit 1
21fi
22
23CHECK() {
24	if ! "$@"; then
25		echo "Error in command ${1}, execution aborted, but some changes may have already been made!" >&2
26		exit 1
27	fi
28}
29
30CPUMASK() {
31	cpu=$1
32	if [ $cpu -ge 32 ]; then
33		mask_fill=""
34		mask_zero="00000000"
35		pow=$((cpu / 32))
36		for ((i = 1; i <= pow; i++)); do
37			mask_fill="${mask_fill},${mask_zero}"
38		done
39
40		cpu=$((cpu - 32 * pow))
41		mask_tmp=$((1 << cpu))
42		mask=$(printf "%X%s" $mask_tmp $mask_fill)
43	else
44		mask_tmp=$((1 << cpu))
45		mask=$(printf "%X" $mask_tmp)
46	fi
47	echo $mask
48}
49
50for i in /sys/class/net/"$iface"/queues/tx-*/xps_rxqs; do
51	j=$(echo $i | cut -d'/' -f7 | cut -d'-' -f2)
52	mask=$(CPUMASK $j)
53	echo ${mask} > $i
54	CHECK echo ${mask} > $i
55done
56