From 8d7b0c30a62ca50e0c104ed4aa600cfb24041161 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Tue, 20 Jun 2017 10:46:52 +0200 Subject: trafgen: gracefully handle ENOBUFS on tx ring teardown pull_and_flush_tx_ring_wait() in the exit path of xmit_fastpath_or_die() might return with errno ENOBUFS (due to the other CPU's processes concurrent access) but will eventually suceed. Thus retry pull_and_flush_tx_ring_wait() as in the main loop of xmit_fastpath_or_die(). Fixes #175 Reported-by: Eduardo Miravalls Sierra Signed-off-by: Tobias Klauser --- trafgen.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/trafgen.c b/trafgen.c index b40d362..5f3555a 100644 --- a/trafgen.c +++ b/trafgen.c @@ -743,7 +743,7 @@ static void xmit_fastpath_or_die(struct ctx *ctx, unsigned int cpu, unsigned lon { int ifindex = dev_io_ifindex_get(ctx->dev_out); uint8_t *out = NULL; - unsigned int it = 0; + unsigned int it = 0, retry = 100; unsigned long num = 1, i = 0; size_t size = ring_size(dev_io_name_get(ctx->dev_out), ctx->reserve_size); struct ring tx_ring; @@ -812,7 +812,8 @@ static void xmit_fastpath_or_die(struct ctx *ctx, unsigned int cpu, unsigned lon bug_on(gettimeofday(&end, NULL)); timersub(&end, &start, &diff); - pull_and_flush_tx_ring_wait(sock); + while (pull_and_flush_tx_ring_wait(sock) < 0 && errno == ENOBUFS && retry-- > 0) + usleep(10000); destroy_tx_ring(sock, &tx_ring); stats[cpu].tx_packets = tx_packets; -- cgit v1.2.3-54-g00ecf