mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-18 02:46:06 +00:00
selftests/xsk: remove namespaces
Remove the namespaces used as they fill no function. This will simplify the code for speeding up the tests in the following commits. Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com> Acked-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> Link: https://lore.kernel.org/r/20230111093526.11682-9-magnus.karlsson@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
efe620e5ba
commit
64aef77d75
@ -24,8 +24,6 @@
|
|||||||
# ----------- | ----------
|
# ----------- | ----------
|
||||||
# | vethX | --------- | vethY |
|
# | vethX | --------- | vethY |
|
||||||
# ----------- peer ----------
|
# ----------- peer ----------
|
||||||
# | | |
|
|
||||||
# namespaceX | namespaceY
|
|
||||||
#
|
#
|
||||||
# AF_XDP is an address family optimized for high performance packet processing,
|
# AF_XDP is an address family optimized for high performance packet processing,
|
||||||
# it is XDP’s user-space interface.
|
# it is XDP’s user-space interface.
|
||||||
@ -39,10 +37,9 @@
|
|||||||
# Prerequisites setup by script:
|
# Prerequisites setup by script:
|
||||||
#
|
#
|
||||||
# Set up veth interfaces as per the topology shown ^^:
|
# Set up veth interfaces as per the topology shown ^^:
|
||||||
# * setup two veth interfaces and one namespace
|
# * setup two veth interfaces
|
||||||
# ** veth<xxxx> in root namespace
|
# ** veth<xxxx>
|
||||||
# ** veth<yyyy> in af_xdp<xxxx> namespace
|
# ** veth<yyyy>
|
||||||
# ** namespace af_xdp<xxxx>
|
|
||||||
# *** xxxx and yyyy are randomly generated 4 digit numbers used to avoid
|
# *** xxxx and yyyy are randomly generated 4 digit numbers used to avoid
|
||||||
# conflict with any existing interface
|
# conflict with any existing interface
|
||||||
# * tests the veth and xsk layers of the topology
|
# * tests the veth and xsk layers of the topology
|
||||||
@ -103,28 +100,25 @@ VETH0_POSTFIX=$(cat ${URANDOM} | tr -dc '0-9' | fold -w 256 | head -n 1 | head -
|
|||||||
VETH0=ve${VETH0_POSTFIX}
|
VETH0=ve${VETH0_POSTFIX}
|
||||||
VETH1_POSTFIX=$(cat ${URANDOM} | tr -dc '0-9' | fold -w 256 | head -n 1 | head --bytes 4)
|
VETH1_POSTFIX=$(cat ${URANDOM} | tr -dc '0-9' | fold -w 256 | head -n 1 | head --bytes 4)
|
||||||
VETH1=ve${VETH1_POSTFIX}
|
VETH1=ve${VETH1_POSTFIX}
|
||||||
NS0=root
|
|
||||||
NS1=af_xdp${VETH1_POSTFIX}
|
|
||||||
MTU=1500
|
MTU=1500
|
||||||
|
|
||||||
trap ctrl_c INT
|
trap ctrl_c INT
|
||||||
|
|
||||||
function ctrl_c() {
|
function ctrl_c() {
|
||||||
cleanup_exit ${VETH0} ${VETH1} ${NS1}
|
cleanup_exit ${VETH0} ${VETH1}
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
setup_vethPairs() {
|
setup_vethPairs() {
|
||||||
if [[ $verbose -eq 1 ]]; then
|
if [[ $verbose -eq 1 ]]; then
|
||||||
echo "setting up ${VETH0}: namespace: ${NS0}"
|
echo "setting up ${VETH0}"
|
||||||
fi
|
fi
|
||||||
ip netns add ${NS1}
|
|
||||||
ip link add ${VETH0} numtxqueues 4 numrxqueues 4 type veth peer name ${VETH1} numtxqueues 4 numrxqueues 4
|
ip link add ${VETH0} numtxqueues 4 numrxqueues 4 type veth peer name ${VETH1} numtxqueues 4 numrxqueues 4
|
||||||
if [ -f /proc/net/if_inet6 ]; then
|
if [ -f /proc/net/if_inet6 ]; then
|
||||||
echo 1 > /proc/sys/net/ipv6/conf/${VETH0}/disable_ipv6
|
echo 1 > /proc/sys/net/ipv6/conf/${VETH0}/disable_ipv6
|
||||||
fi
|
fi
|
||||||
if [[ $verbose -eq 1 ]]; then
|
if [[ $verbose -eq 1 ]]; then
|
||||||
echo "setting up ${VETH1}: namespace: ${NS1}"
|
echo "setting up ${VETH1}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $busy_poll -eq 1 ]]; then
|
if [[ $busy_poll -eq 1 ]]; then
|
||||||
@ -134,18 +128,15 @@ setup_vethPairs() {
|
|||||||
echo 200000 > /sys/class/net/${VETH1}/gro_flush_timeout
|
echo 200000 > /sys/class/net/${VETH1}/gro_flush_timeout
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ip link set ${VETH1} netns ${NS1}
|
ip link set ${VETH1} mtu ${MTU}
|
||||||
ip netns exec ${NS1} ip link set ${VETH1} mtu ${MTU}
|
|
||||||
ip link set ${VETH0} mtu ${MTU}
|
ip link set ${VETH0} mtu ${MTU}
|
||||||
ip netns exec ${NS1} ip link set ${VETH1} up
|
ip link set ${VETH1} up
|
||||||
ip netns exec ${NS1} ip link set dev lo up
|
|
||||||
ip link set ${VETH0} up
|
ip link set ${VETH0} up
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ ! -z $ETH ]; then
|
if [ ! -z $ETH ]; then
|
||||||
VETH0=${ETH}
|
VETH0=${ETH}
|
||||||
VETH1=${ETH}
|
VETH1=${ETH}
|
||||||
NS1=""
|
|
||||||
else
|
else
|
||||||
validate_root_exec
|
validate_root_exec
|
||||||
validate_veth_support ${VETH0}
|
validate_veth_support ${VETH0}
|
||||||
@ -155,7 +146,7 @@ else
|
|||||||
retval=$?
|
retval=$?
|
||||||
if [ $retval -ne 0 ]; then
|
if [ $retval -ne 0 ]; then
|
||||||
test_status $retval "${TEST_NAME}"
|
test_status $retval "${TEST_NAME}"
|
||||||
cleanup_exit ${VETH0} ${VETH1} ${NS1}
|
cleanup_exit ${VETH0} ${VETH1}
|
||||||
exit $retval
|
exit $retval
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@ -179,14 +170,14 @@ statusList=()
|
|||||||
TEST_NAME="XSK_SELFTESTS_${VETH0}_SOFTIRQ"
|
TEST_NAME="XSK_SELFTESTS_${VETH0}_SOFTIRQ"
|
||||||
|
|
||||||
if [[ $debug -eq 1 ]]; then
|
if [[ $debug -eq 1 ]]; then
|
||||||
echo "-i" ${VETH0} "-i" ${VETH1},${NS1}
|
echo "-i" ${VETH0} "-i" ${VETH1}
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec_xskxceiver
|
exec_xskxceiver
|
||||||
|
|
||||||
if [ -z $ETH ]; then
|
if [ -z $ETH ]; then
|
||||||
cleanup_exit ${VETH0} ${VETH1} ${NS1}
|
cleanup_exit ${VETH0} ${VETH1}
|
||||||
fi
|
fi
|
||||||
TEST_NAME="XSK_SELFTESTS_${VETH0}_BUSY_POLL"
|
TEST_NAME="XSK_SELFTESTS_${VETH0}_BUSY_POLL"
|
||||||
busy_poll=1
|
busy_poll=1
|
||||||
@ -199,7 +190,7 @@ exec_xskxceiver
|
|||||||
## END TESTS
|
## END TESTS
|
||||||
|
|
||||||
if [ -z $ETH ]; then
|
if [ -z $ETH ]; then
|
||||||
cleanup_exit ${VETH0} ${VETH1} ${NS1}
|
cleanup_exit ${VETH0} ${VETH1}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
failures=0
|
failures=0
|
||||||
|
@ -55,21 +55,13 @@ test_exit()
|
|||||||
|
|
||||||
clear_configs()
|
clear_configs()
|
||||||
{
|
{
|
||||||
if [ $(ip netns show | grep $3 &>/dev/null; echo $?;) == 0 ]; then
|
|
||||||
[ $(ip netns exec $3 ip link show $2 &>/dev/null; echo $?;) == 0 ] &&
|
|
||||||
{ ip netns exec $3 ip link del $2; }
|
|
||||||
ip netns del $3
|
|
||||||
fi
|
|
||||||
#Once we delete a veth pair node, the entire veth pair is removed,
|
|
||||||
#this is just to be cautious just incase the NS does not exist then
|
|
||||||
#veth node inside NS won't get removed so we explicitly remove it
|
|
||||||
[ $(ip link show $1 &>/dev/null; echo $?;) == 0 ] &&
|
[ $(ip link show $1 &>/dev/null; echo $?;) == 0 ] &&
|
||||||
{ ip link del $1; }
|
{ ip link del $1; }
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup_exit()
|
cleanup_exit()
|
||||||
{
|
{
|
||||||
clear_configs $1 $2 $3
|
clear_configs $1 $2
|
||||||
}
|
}
|
||||||
|
|
||||||
validate_ip_utility()
|
validate_ip_utility()
|
||||||
@ -83,7 +75,7 @@ exec_xskxceiver()
|
|||||||
ARGS+="-b "
|
ARGS+="-b "
|
||||||
fi
|
fi
|
||||||
|
|
||||||
./${XSKOBJ} -i ${VETH0} -i ${VETH1},${NS1} ${ARGS}
|
./${XSKOBJ} -i ${VETH0} -i ${VETH1} ${ARGS}
|
||||||
|
|
||||||
retval=$?
|
retval=$?
|
||||||
test_status $retval "${TEST_NAME}"
|
test_status $retval "${TEST_NAME}"
|
||||||
|
@ -55,12 +55,11 @@
|
|||||||
* Flow:
|
* Flow:
|
||||||
* -----
|
* -----
|
||||||
* - Single process spawns two threads: Tx and Rx
|
* - Single process spawns two threads: Tx and Rx
|
||||||
* - Each of these two threads attach to a veth interface within their assigned
|
* - Each of these two threads attach to a veth interface
|
||||||
* namespaces
|
* - Each thread creates one AF_XDP socket connected to a unique umem for each
|
||||||
* - Each thread Creates one AF_XDP socket connected to a unique umem for each
|
|
||||||
* veth interface
|
* veth interface
|
||||||
* - Tx thread Transmits 10k packets from veth<xxxx> to veth<yyyy>
|
* - Tx thread Transmits a number of packets from veth<xxxx> to veth<yyyy>
|
||||||
* - Rx thread verifies if all 10k packets were received and delivered in-order,
|
* - Rx thread verifies if all packets were received and delivered in-order,
|
||||||
* and have the right content
|
* and have the right content
|
||||||
*
|
*
|
||||||
* Enable/disable packet dump mode:
|
* Enable/disable packet dump mode:
|
||||||
@ -399,28 +398,6 @@ static void usage(const char *prog)
|
|||||||
ksft_print_msg(str, prog);
|
ksft_print_msg(str, prog);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int switch_namespace(const char *nsname)
|
|
||||||
{
|
|
||||||
char fqns[26] = "/var/run/netns/";
|
|
||||||
int nsfd;
|
|
||||||
|
|
||||||
if (!nsname || strlen(nsname) == 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
strncat(fqns, nsname, sizeof(fqns) - strlen(fqns) - 1);
|
|
||||||
nsfd = open(fqns, O_RDONLY);
|
|
||||||
|
|
||||||
if (nsfd == -1)
|
|
||||||
exit_with_error(errno);
|
|
||||||
|
|
||||||
if (setns(nsfd, 0) == -1)
|
|
||||||
exit_with_error(errno);
|
|
||||||
|
|
||||||
print_verbose("NS switched: %s\n", nsname);
|
|
||||||
|
|
||||||
return nsfd;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool validate_interface(struct ifobject *ifobj)
|
static bool validate_interface(struct ifobject *ifobj)
|
||||||
{
|
{
|
||||||
if (!strcmp(ifobj->ifname, ""))
|
if (!strcmp(ifobj->ifname, ""))
|
||||||
@ -438,8 +415,6 @@ static void parse_command_line(struct ifobject *ifobj_tx, struct ifobject *ifobj
|
|||||||
opterr = 0;
|
opterr = 0;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
char *sptr, *token;
|
|
||||||
|
|
||||||
c = getopt_long(argc, argv, "i:Dvb", long_options, &option_index);
|
c = getopt_long(argc, argv, "i:Dvb", long_options, &option_index);
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
break;
|
break;
|
||||||
@ -453,11 +428,8 @@ static void parse_command_line(struct ifobject *ifobj_tx, struct ifobject *ifobj
|
|||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
|
|
||||||
sptr = strndupa(optarg, strlen(optarg));
|
memcpy(ifobj->ifname, optarg,
|
||||||
memcpy(ifobj->ifname, strsep(&sptr, ","), MAX_INTERFACE_NAME_CHARS);
|
min_t(size_t, MAX_INTERFACE_NAME_CHARS, strlen(optarg)));
|
||||||
token = strsep(&sptr, ",");
|
|
||||||
if (token)
|
|
||||||
memcpy(ifobj->nsname, token, MAX_INTERFACES_NAMESPACE_CHARS);
|
|
||||||
interface_nb++;
|
interface_nb++;
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
@ -1283,8 +1255,6 @@ static void thread_common_ops(struct test_spec *test, struct ifobject *ifobject)
|
|||||||
int ret, ifindex;
|
int ret, ifindex;
|
||||||
void *bufs;
|
void *bufs;
|
||||||
|
|
||||||
ifobject->ns_fd = switch_namespace(ifobject->nsname);
|
|
||||||
|
|
||||||
if (ifobject->umem->unaligned_mode)
|
if (ifobject->umem->unaligned_mode)
|
||||||
mmap_flags |= MAP_HUGETLB;
|
mmap_flags |= MAP_HUGETLB;
|
||||||
|
|
||||||
@ -1843,8 +1813,6 @@ static struct ifobject *ifobject_create(void)
|
|||||||
if (!ifobj->umem)
|
if (!ifobj->umem)
|
||||||
goto out_umem;
|
goto out_umem;
|
||||||
|
|
||||||
ifobj->ns_fd = -1;
|
|
||||||
|
|
||||||
return ifobj;
|
return ifobj;
|
||||||
|
|
||||||
out_umem:
|
out_umem:
|
||||||
@ -1856,8 +1824,6 @@ out_xsk_arr:
|
|||||||
|
|
||||||
static void ifobject_delete(struct ifobject *ifobj)
|
static void ifobject_delete(struct ifobject *ifobj)
|
||||||
{
|
{
|
||||||
if (ifobj->ns_fd != -1)
|
|
||||||
close(ifobj->ns_fd);
|
|
||||||
free(ifobj->umem);
|
free(ifobj->umem);
|
||||||
free(ifobj->xsk_arr);
|
free(ifobj->xsk_arr);
|
||||||
free(ifobj);
|
free(ifobj);
|
||||||
|
@ -30,7 +30,6 @@
|
|||||||
#define TEST_CONTINUE 1
|
#define TEST_CONTINUE 1
|
||||||
#define MAX_INTERFACES 2
|
#define MAX_INTERFACES 2
|
||||||
#define MAX_INTERFACE_NAME_CHARS 16
|
#define MAX_INTERFACE_NAME_CHARS 16
|
||||||
#define MAX_INTERFACES_NAMESPACE_CHARS 16
|
|
||||||
#define MAX_SOCKETS 2
|
#define MAX_SOCKETS 2
|
||||||
#define MAX_TEST_NAME_SIZE 32
|
#define MAX_TEST_NAME_SIZE 32
|
||||||
#define MAX_TEARDOWN_ITER 10
|
#define MAX_TEARDOWN_ITER 10
|
||||||
@ -133,14 +132,12 @@ typedef void *(*thread_func_t)(void *arg);
|
|||||||
|
|
||||||
struct ifobject {
|
struct ifobject {
|
||||||
char ifname[MAX_INTERFACE_NAME_CHARS];
|
char ifname[MAX_INTERFACE_NAME_CHARS];
|
||||||
char nsname[MAX_INTERFACES_NAMESPACE_CHARS];
|
|
||||||
struct xsk_socket_info *xsk;
|
struct xsk_socket_info *xsk;
|
||||||
struct xsk_socket_info *xsk_arr;
|
struct xsk_socket_info *xsk_arr;
|
||||||
struct xsk_umem_info *umem;
|
struct xsk_umem_info *umem;
|
||||||
thread_func_t func_ptr;
|
thread_func_t func_ptr;
|
||||||
validation_func_t validation_func;
|
validation_func_t validation_func;
|
||||||
struct pkt_stream *pkt_stream;
|
struct pkt_stream *pkt_stream;
|
||||||
int ns_fd;
|
|
||||||
int xsk_map_fd;
|
int xsk_map_fd;
|
||||||
u32 dst_ip;
|
u32 dst_ip;
|
||||||
u32 src_ip;
|
u32 src_ip;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user