xref: /linux/tools/testing/selftests/net/busy_poll_test.sh (revision b61104e7a6349bd2c2b3e2fb3260d87f15eda8f4)
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