1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3source lib.sh 4 5NSIM_SV_ID=$((256 + RANDOM % 256)) 6NSIM_SV_SYS=/sys/bus/netdevsim/devices/netdevsim$NSIM_SV_ID 7NSIM_CL_ID=$((512 + RANDOM % 256)) 8NSIM_CL_SYS=/sys/bus/netdevsim/devices/netdevsim$NSIM_CL_ID 9 10NSIM_DEV_SYS_NEW=/sys/bus/netdevsim/new_device 11NSIM_DEV_SYS_DEL=/sys/bus/netdevsim/del_device 12NSIM_DEV_SYS_LINK=/sys/bus/netdevsim/link_device 13NSIM_DEV_SYS_UNLINK=/sys/bus/netdevsim/unlink_device 14 15SERVER_IP=192.168.1.1 16CLIENT_IP=192.168.1.2 17SERVER_PORT=48675 18 19# busy poll config 20MAX_EVENTS=8 21BUSY_POLL_USECS=0 22BUSY_POLL_BUDGET=16 23PREFER_BUSY_POLL=1 24 25# IRQ deferral config 26NAPI_DEFER_HARD_IRQS=100 27GRO_FLUSH_TIMEOUT=50000 28SUSPEND_TIMEOUT=20000000 29 30NAPI_THREADED_MODE_BUSY_POLL=2 31 32setup_ns() 33{ 34 set -e 35 ip netns add nssv 36 ip netns add nscl 37 38 NSIM_SV_NAME=$(find $NSIM_SV_SYS/net -maxdepth 1 -type d ! \ 39 -path $NSIM_SV_SYS/net -exec basename {} \;) 40 NSIM_CL_NAME=$(find $NSIM_CL_SYS/net -maxdepth 1 -type d ! \ 41 -path $NSIM_CL_SYS/net -exec basename {} \;) 42 43 # ensure the server has 1 queue 44 ethtool -L $NSIM_SV_NAME combined 1 2>/dev/null 45 46 ip link set $NSIM_SV_NAME netns nssv 47 ip link set $NSIM_CL_NAME netns nscl 48 49 ip netns exec nssv ip addr add "${SERVER_IP}/24" dev $NSIM_SV_NAME 50 ip netns exec nscl ip addr add "${CLIENT_IP}/24" dev $NSIM_CL_NAME 51 52 ip netns exec nssv ip link set dev $NSIM_SV_NAME up 53 ip netns exec nscl ip link set dev $NSIM_CL_NAME up 54 55 set +e 56} 57 58cleanup_ns() 59{ 60 ip netns del nscl 61 ip netns del nssv 62} 63 64test_busypoll() 65{ 66 suspend_value=${1:-0} 67 napi_threaded_value=${2:-0} 68 prefer_busy_poll_value=${3:-$PREFER_BUSY_POLL} 69 70 tmp_file=$(mktemp) 71 out_file=$(mktemp) 72 73 # fill a test file with random data 74 dd if=/dev/urandom of=${tmp_file} bs=1M count=1 2> /dev/null 75 76 timeout -k 1s 30s ip netns exec nssv ./busy_poller \ 77 -p${SERVER_PORT} \ 78 -b${SERVER_IP} \ 79 -m${MAX_EVENTS} \ 80 -u${BUSY_POLL_USECS} \ 81 -P${prefer_busy_poll_value} \ 82 -g${BUSY_POLL_BUDGET} \ 83 -i${NSIM_SV_IFIDX} \ 84 -s${suspend_value} \ 85 -t${napi_threaded_value} \ 86 -o${out_file}& 87 88 wait_local_port_listen nssv ${SERVER_PORT} tcp 89 90 ip netns exec nscl socat -u $tmp_file TCP:${SERVER_IP}:${SERVER_PORT} 91 92 wait 93 94 tmp_file_md5sum=$(md5sum $tmp_file | cut -f1 -d' ') 95 out_file_md5sum=$(md5sum $out_file | cut -f1 -d' ') 96 97 if [ "$tmp_file_md5sum" = "$out_file_md5sum" ]; then 98 res=0 99 else 100 echo "md5sum mismatch" 101 echo "input file md5sum: ${tmp_file_md5sum}"; 102 echo "output file md5sum: ${out_file_md5sum}"; 103 res=1 104 fi 105 106 rm $out_file $tmp_file 107 108 return $res 109} 110 111test_busypoll_with_suspend() 112{ 113 test_busypoll ${SUSPEND_TIMEOUT} 114 115 return $? 116} 117 118test_busypoll_with_napi_threaded() 119{ 120 # Only enable napi threaded poll. Set suspend timeout and prefer busy 121 # poll to 0. 122 test_busypoll 0 ${NAPI_THREADED_MODE_BUSY_POLL} 0 123 124 return $? 125} 126 127### 128### Code start 129### 130 131modprobe netdevsim 132 133# linking 134 135echo $NSIM_SV_ID > $NSIM_DEV_SYS_NEW 136echo $NSIM_CL_ID > $NSIM_DEV_SYS_NEW 137udevadm settle 138 139setup_ns 140 141NSIM_SV_FD=$((256 + RANDOM % 256)) 142exec {NSIM_SV_FD}</var/run/netns/nssv 143NSIM_SV_IFIDX=$(ip netns exec nssv cat /sys/class/net/$NSIM_SV_NAME/ifindex) 144 145NSIM_CL_FD=$((256 + RANDOM % 256)) 146exec {NSIM_CL_FD}</var/run/netns/nscl 147NSIM_CL_IFIDX=$(ip netns exec nscl cat /sys/class/net/$NSIM_CL_NAME/ifindex) 148 149echo "$NSIM_SV_FD:$NSIM_SV_IFIDX $NSIM_CL_FD:$NSIM_CL_IFIDX" > \ 150 $NSIM_DEV_SYS_LINK 151 152if [ $? -ne 0 ]; then 153 echo "linking netdevsim1 with netdevsim2 should succeed" 154 cleanup_ns 155 exit 1 156fi 157 158test_busypoll 159if [ $? -ne 0 ]; then 160 echo "test_busypoll failed" 161 cleanup_ns 162 exit 1 163fi 164 165test_busypoll_with_suspend 166if [ $? -ne 0 ]; then 167 echo "test_busypoll_with_suspend failed" 168 cleanup_ns 169 exit 1 170fi 171 172test_busypoll_with_napi_threaded 173if [ $? -ne 0 ]; then 174 echo "test_busypoll_with_napi_threaded failed" 175 cleanup_ns 176 exit 1 177fi 178 179echo "$NSIM_SV_FD:$NSIM_SV_IFIDX" > $NSIM_DEV_SYS_UNLINK 180 181echo $NSIM_CL_ID > $NSIM_DEV_SYS_DEL 182 183cleanup_ns 184 185modprobe -r netdevsim 186 187exit 0 188