1#!/bin/bash 2# SPDX-License-Identifier: BSD-3-Clause 3# Copyright (c) 2019, 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