From 917f49cfd0d1fc6c1ae890528835ece018741baa Mon Sep 17 00:00:00 2001 From: David Hunt Date: Fri, 14 Apr 2017 09:59:53 +0100 Subject: [PATCH] distributor: fix crash in flush Occasionally, the distributor single-packet-at-a-time mode will segfault because it inadvertently calls some burst mode code when flushing packets. This patch ensures that only the v20 (single mode) codepath is used, and returns without falling through to the burst mode code. Fixes: 775003ad2f96 ("distributor: add new burst-capable library") Signed-off-by: David Hunt Tested-by: Yong Liu Acked-by: Bruce Richardson --- lib/librte_distributor/rte_distributor.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/librte_distributor/rte_distributor.c b/lib/librte_distributor/rte_distributor.c index 4725904c33..e4dfa7f0e3 100644 --- a/lib/librte_distributor/rte_distributor.c +++ b/lib/librte_distributor/rte_distributor.c @@ -555,7 +555,7 @@ total_outstanding(const struct rte_distributor *d) int rte_distributor_flush_v1705(struct rte_distributor *d) { - const unsigned int flushed = total_outstanding(d); + unsigned int flushed; unsigned int wkr; if (d->alg_type == RTE_DIST_ALG_SINGLE) { @@ -563,6 +563,8 @@ rte_distributor_flush_v1705(struct rte_distributor *d) return rte_distributor_flush_v20(d->d_v20); } + flushed = total_outstanding(d); + while (total_outstanding(d) > 0) rte_distributor_process(d, NULL, 0); @@ -590,6 +592,7 @@ rte_distributor_clear_returns_v1705(struct rte_distributor *d) if (d->alg_type == RTE_DIST_ALG_SINGLE) { /* Call the old API */ rte_distributor_clear_returns_v20(d->d_v20); + return; } /* throw away returns, so workers can exit */ -- 2.20.1