On Tue, Jan 31, 2023 at 8:06 AM Andrei Gherzan andrei.gherzan@canonical.com wrote:
The test tool can check that the zerocopy number of completions value is valid taking into consideration the number of datagram send calls. This can catch the system into a state where the datagrams are still in the system (for example in a qdisk, waiting for the network interface to return a completion notification, etc).
This change adds a retry logic of computing the number of completions up to a configurable (via CLI) timeout (default: 2 seconds).
Signed-off-by: Andrei Gherzan andrei.gherzan@canonical.com
tools/testing/selftests/net/udpgso_bench_tx.c | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-)
diff --git a/tools/testing/selftests/net/udpgso_bench_tx.c b/tools/testing/selftests/net/udpgso_bench_tx.c index b47b5c32039f..5a29b5f24023 100644 --- a/tools/testing/selftests/net/udpgso_bench_tx.c +++ b/tools/testing/selftests/net/udpgso_bench_tx.c @@ -62,6 +62,7 @@ static int cfg_payload_len = (1472 * 42); static int cfg_port = 8000; static int cfg_runtime_ms = -1; static bool cfg_poll; +static int cfg_poll_loop_timeout_ms = 2000; static bool cfg_segment; static bool cfg_sendmmsg; static bool cfg_tcp; @@ -235,16 +236,17 @@ static void flush_errqueue_recv(int fd) } }
-static void flush_errqueue(int fd, const bool do_poll) +static void flush_errqueue(int fd, const bool do_poll,
unsigned long poll_timeout, const bool poll_err)
{ if (do_poll) { struct pollfd fds = {0}; int ret;
fds.fd = fd;
ret = poll(&fds, 1, 500);
ret = poll(&fds, 1, poll_timeout); if (ret == 0) {
if (cfg_verbose)
if ((cfg_verbose) && (poll_err)) fprintf(stderr, "poll timeout\n"); } else if (ret < 0) { error(1, errno, "poll");
@@ -254,6 +256,22 @@ static void flush_errqueue(int fd, const bool do_poll) flush_errqueue_recv(fd); }
+static void flush_errqueue_retry(int fd, const bool do_poll, unsigned long num_sends) +{
unsigned long tnow, tstop;
bool first_try = true;
tnow = gettimeofday_ms();
tstop = tnow + cfg_poll_loop_timeout_ms;
do {
flush_errqueue(fd, do_poll, tstop - tnow, first_try);
first_try = false;
if (!do_poll)
usleep(1000); // a throttling delay if polling is enabled
never reached