Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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