On Wed, Feb 17, 2021 at 04:02:13PM +0000, Ciara Loftus wrote: > Prior to this commit individual xsk tests were launched from the > shell script 'test_xsk.sh'. When adding a new test type, two new test > configurations had to be added to this file - one for each of the > supported XDP 'modes' (skb or drv). Should zero copy support be added to > the xsk selftest framework in the future, three new test configurations > would need to be added for each new test type. Each new test type also > typically requires new CLI arguments for the xdpxceiver program. > > This commit aims to reduce the overhead of adding new tests, by launching > the test configurations from within the xdpxceiver program itself, using > simple loops. Every test is run every time the C program is executed. Many > of the CLI arguments can be removed as a result. > > Signed-off-by: Ciara Loftus <ciara.loftus@xxxxxxxxx> > --- > tools/testing/selftests/bpf/test_xsk.sh | 112 +----------- > tools/testing/selftests/bpf/xdpxceiver.c | 199 ++++++++++++--------- > tools/testing/selftests/bpf/xdpxceiver.h | 27 ++- > tools/testing/selftests/bpf/xsk_prereqs.sh | 24 +-- > 4 files changed, 139 insertions(+), 223 deletions(-) > Good cleanup! I have a series of fixes/cleanups as well and I need to introduce a new test over here, so your work makes it easier for me. One nit below and once you address Bjorn's request, then feel free to add my: Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@xxxxxxxxx> [...] > +static int configure_skb(void) > +{ > + > + char cmd[80]; > + > + snprintf(cmd, sizeof(cmd), "ip link set dev %s xdpdrv off", ifdict[0]->ifname); > + if (system(cmd)) { > + ksft_test_result_fail("Failed to configure native mode on iface %s\n", > + ifdict[0]->ifname); > + return -1; > + } > + snprintf(cmd, sizeof(cmd), "ip netns exec %s ip link set dev %s xdpdrv off", > + ifdict[1]->nsname, ifdict[1]->ifname); > + if (system(cmd)) { > + ksft_test_result_fail("Failed to configure native mode on iface/ns %s\n", > + ifdict[1]->ifname, ifdict[1]->nsname); > + return -1; > + } > + > + cur_mode = TEST_MODE_SKB; > + > + return 0; > + > +} > + > +static int configure_drv(void) > +{ > + char cmd[80]; > + > + snprintf(cmd, sizeof(cmd), "ip link set dev %s xdpgeneric off", ifdict[0]->ifname); > + if (system(cmd)) { > + ksft_test_result_fail("Failed to configure native mode on iface %s\n", > + ifdict[0]->ifname); > + return -1; > + } > + snprintf(cmd, sizeof(cmd), "ip netns exec %s ip link set dev %s xdpgeneric off", > + ifdict[1]->nsname, ifdict[1]->ifname); > + if (system(cmd)) { > + ksft_test_result_fail("Failed to configure native mode on iface/ns %s\n", > + ifdict[1]->ifname, ifdict[1]->nsname); > + return -1; > + } > + > + cur_mode = TEST_MODE_DRV; > + > + return 0; > +} > + > +static void run_pkt_test(int mode, int type) > +{ > + test_type = type; > + > + /* reset defaults after potential previous test */ > + xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST; > + pkt_counter = 0; > + switching_notify = 0; > + bidi_pass = 0; > + prev_pkt = -1; > + ifdict[0]->fv.vector = tx; > + ifdict[1]->fv.vector = rx; > + > + switch (mode) { > + case (TEST_MODE_SKB): > + if (cur_mode != TEST_MODE_SKB) > + configure_skb(); Should you check a return value over here? > + xdp_flags |= XDP_FLAGS_SKB_MODE; > + uut = TEST_MODE_SKB; > + break; > + case (TEST_MODE_DRV): > + if (cur_mode != TEST_MODE_DRV) > + configure_drv(); ditto > + xdp_flags |= XDP_FLAGS_DRV_MODE; > + uut = TEST_MODE_DRV; > + break; > + default: > + break; > + } > + > + pthread_init_mutex(); > + > + if ((test_type != TEST_TYPE_TEARDOWN) && (test_type != TEST_TYPE_BIDI)) > + testapp_validate(); > + else > + testapp_sockets(); > + > + pthread_destroy_mutex(); > +} > + > int main(int argc, char **argv) > { > struct rlimit _rlim = { RLIM_INFINITY, RLIM_INFINITY }; > @@ -1021,6 +1062,7 @@ int main(int argc, char **argv) > const char *IP2 = "192.168.100.161"; > u16 UDP_DST_PORT = 2020; > u16 UDP_SRC_PORT = 2121; > + int i, j; > > ifaceconfig = malloc(sizeof(struct ifaceconfigobj)); > memcpy(ifaceconfig->dst_mac, MAC1, ETH_ALEN); > @@ -1046,24 +1088,19 @@ int main(int argc, char **argv) > > init_iface_config(ifaceconfig); > > - pthread_init_mutex(); > + ksft_set_plan(TEST_MODE_MAX * TEST_TYPE_MAX); > > - ksft_set_plan(1); > + configure_skb(); > + cur_mode = TEST_MODE_SKB; > > - if (!opt_teardown && !opt_bidi) { > - testapp_validate(); > - } else if (opt_teardown && opt_bidi) { > - ksft_test_result_fail("ERROR: parameters -T and -B cannot be used together\n"); > - ksft_exit_xfail(); > - } else { > - testapp_sockets(); > + for (i = 0; i < TEST_MODE_MAX; i++) { > + for (j = 0; j < TEST_TYPE_MAX; j++) > + run_pkt_test(i, j); > } > > for (int i = 0; i < MAX_INTERFACES; i++) > free(ifdict[i]); > > - pthread_destroy_mutex(); > - > ksft_exit_pass(); > > return 0;