From patchwork Fri Apr 14 08:59:53 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Hunt, David" X-Patchwork-Id: 23642 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 02D5737B3; Fri, 14 Apr 2017 10:59:17 +0200 (CEST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id E1C70378B for ; Fri, 14 Apr 2017 10:59:15 +0200 (CEST) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 14 Apr 2017 01:59:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos; i="5.37,197,1488873600"; d="scan'208"; a="1155848375" Received: from silpixa00397515.ir.intel.com (HELO silpixa00397515.ger.corp.intel.com) ([10.237.223.14]) by fmsmga002.fm.intel.com with ESMTP; 14 Apr 2017 01:59:11 -0700 From: David Hunt To: dev@dpdk.org Cc: bruce.richardson@intel.com, David Hunt Date: Fri, 14 Apr 2017 09:59:53 +0100 Message-Id: <1492160393-125112-1-git-send-email-david.hunt@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1492072587-121343-1-git-send-email-david.hunt@intel.com> References: <1492072587-121343-1-git-send-email-david.hunt@intel.com> Subject: [dpdk-dev] [PATCH v2] lib/distributor: fix segfaults in flush X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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") v2: Extented commit message. Patch remains the same. 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 4725904..e4dfa7f 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 */