From patchwork Wed Aug 23 08:15:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?N=C3=A9lio_Laranjeiro?= X-Patchwork-Id: 27744 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 E53EA7D72; Wed, 23 Aug 2017 10:15:43 +0200 (CEST) Received: from mail-wr0-f182.google.com (mail-wr0-f182.google.com [209.85.128.182]) by dpdk.org (Postfix) with ESMTP id 688237D5A for ; Wed, 23 Aug 2017 10:15:37 +0200 (CEST) Received: by mail-wr0-f182.google.com with SMTP id p8so3028539wrf.5 for ; Wed, 23 Aug 2017 01:15:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=35ZSX6JWxUZXMNovBb2U7p90WPZQsFJSegoKdl5AEeM=; b=0QKcj7HDwmdl1dcLXGbd5mY0t2TanlS2KEG1lETL+dlnytrUncxDPyQAOfTlrcjqA7 az/Jr9ppKNC6ITV0pslgo9GiNqkKqN9eVGqox//RjdLF1ETa3qw/hJ6SiZjhN2/iKoml GBuz6LPmTJoKbPGYcxIksY+9i5mqNWivmz0BS9YjpsubFxEz4L3vd3G+T4p7r1+h6WWz 7qHdh+mQraKYLqZ/KeEFtPSrOgzAkDilM4WUd1F8LIkOVhndroYAhhQ3bMXisBjdU4x3 90PopiMm7SnuEYeEamMd7uKTP7hiHjNnn/0RiSQqjf9KL16RpC3XKKhbYPgl5TWZnRXJ vQsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=35ZSX6JWxUZXMNovBb2U7p90WPZQsFJSegoKdl5AEeM=; b=obby93azmj6FtandA7ZrMa5jxPq/N8rCXTlR5ukHQBJG/6eRhst0MyW4llWwdY1qA1 kKxco3lEKFL1+3YEFzcanwjcGuMr3iR6jnL0/nSM+Mfrga7zN/iH89+GSLKjSGSnTKwV DUlRiZJwta+1wMMjEQmBUiohA28tHS8l6VCq6RgirFxENUc1tkPLHm3mXMYO2HvgW3jz 3cM1DfPw5k47R+RgEXCylAO2rjQkZYAJMu8uOoULeNl55vdq5XVC7R1iPYk7yybnK8eu RkDKNpGdRJZtIMrY7KY6ho/M6pJTXDSvpJ0tP+/xdaUsqEZWj9T78MToIYE8+iRUIjmf pGaA== X-Gm-Message-State: AHYfb5hxCZbv4yhdbxkwmn0cQH85yhjEdlrIR1QLLJcRx+/8GZZvYmeY 0xCwlqYDru8kADB6On3dNA== X-Received: by 10.223.155.138 with SMTP id d10mr937709wrc.20.1503476136774; Wed, 23 Aug 2017 01:15:36 -0700 (PDT) Received: from ping.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id c19sm508450wre.43.2017.08.23.01.15.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 23 Aug 2017 01:15:35 -0700 (PDT) From: Nelio Laranjeiro To: dev@dpdk.org, Ferruh Yigit Cc: Shahaf Shuler Date: Wed, 23 Aug 2017 10:15:07 +0200 Message-Id: <5dbd9df5c84fd93204954cf81ba8f4625cb2ef0e.1503475999.git.nelio.laranjeiro@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v2 3/8] net/mlx5: cleanup Rx ring in free functions 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" Vector PMD returns buffers to the application without setting the pointers in the Rx queue to null nor allocating them. When the PMD cleanup the ring it needs to take a special care to those pointers to not free the mbufs before the application have used them nor if the application have already freed them. Signed-off-by: Nelio Laranjeiro Acked-by: Yongseok Koh --- drivers/net/mlx5/mlx5_rxq.c | 54 ++++++++++++++++---------------------------- drivers/net/mlx5/mlx5_rxtx.h | 3 +-- 2 files changed, 20 insertions(+), 37 deletions(-) diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c index de54175..2119dfa 100644 --- a/drivers/net/mlx5/mlx5_rxq.c +++ b/drivers/net/mlx5/mlx5_rxq.c @@ -634,32 +634,6 @@ priv_rehash_flows(struct priv *priv) } /** - * Unlike regular Rx function, vPMD Rx doesn't replace mbufs immediately when - * receiving packets. Instead it replaces later in bulk. In rxq->elts[], entries - * from rq_pi to rq_ci are owned by device but the rest is already delivered to - * application. In order not to reuse those mbufs by rxq_alloc_elts(), this - * function must be called to replace used mbufs. - * - * @param rxq - * Pointer to RX queue structure. - */ -static void -rxq_trim_elts(struct rxq *rxq) -{ - const uint16_t q_n = (1 << rxq->elts_n); - const uint16_t q_mask = q_n - 1; - uint16_t used = q_n - (rxq->rq_ci - rxq->rq_pi); - uint16_t i; - - if (!rxq->trim_elts) - return; - for (i = 0; i < used; ++i) - (*rxq->elts)[(rxq->rq_ci + i) & q_mask] = NULL; - rxq->trim_elts = 0; - return; -} - -/** * Allocate RX queue elements. * * @param rxq_ctrl @@ -730,7 +704,6 @@ rxq_alloc_elts(struct rxq_ctrl *rxq_ctrl, unsigned int elts_n) /* Padding with a fake mbuf for vectorized Rx. */ for (i = 0; i < MLX5_VPMD_DESCS_PER_LOOP; ++i) (*rxq->elts)[elts_n + i] = &rxq->fake_mbuf; - rxq->trim_elts = 1; } DEBUG("%p: allocated and configured %u segments (max %u packets)", (void *)rxq_ctrl, elts_n, elts_n / (1 << rxq_ctrl->rxq.sges_n)); @@ -757,17 +730,28 @@ rxq_alloc_elts(struct rxq_ctrl *rxq_ctrl, unsigned int elts_n) static void rxq_free_elts(struct rxq_ctrl *rxq_ctrl) { - unsigned int i; + struct rxq *rxq = &rxq_ctrl->rxq; + const uint16_t q_n = (1 << rxq->elts_n); + const uint16_t q_mask = q_n - 1; + uint16_t used = q_n - (rxq->rq_ci - rxq->rq_pi); + uint16_t i; - rxq_trim_elts(&rxq_ctrl->rxq); DEBUG("%p: freeing WRs", (void *)rxq_ctrl); - if (rxq_ctrl->rxq.elts == NULL) + if (rxq->elts == NULL) return; - - for (i = 0; (i != (1u << rxq_ctrl->rxq.elts_n)); ++i) { - if ((*rxq_ctrl->rxq.elts)[i] != NULL) - rte_pktmbuf_free_seg((*rxq_ctrl->rxq.elts)[i]); - (*rxq_ctrl->rxq.elts)[i] = NULL; + /** + * Some mbuf in the Ring belongs to the application. They cannot be + * freed. + */ + if (rxq_check_vec_support(rxq) > 0) { + for (i = 0; i < used; ++i) + (*rxq->elts)[(rxq->rq_ci + i) & q_mask] = NULL; + rxq->rq_pi = rxq->rq_ci; + } + for (i = 0; (i != (1u << rxq->elts_n)); ++i) { + if ((*rxq->elts)[i] != NULL) + rte_pktmbuf_free_seg((*rxq->elts)[i]); + (*rxq->elts)[i] = NULL; } } diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h index d85ea16..39b217b 100644 --- a/drivers/net/mlx5/mlx5_rxtx.h +++ b/drivers/net/mlx5/mlx5_rxtx.h @@ -116,8 +116,7 @@ struct rxq { unsigned int rss_hash:1; /* RSS hash result is enabled. */ unsigned int mark:1; /* Marked flow available on the queue. */ unsigned int pending_err:1; /* CQE error needs to be handled. */ - unsigned int trim_elts:1; /* Whether elts needs clean-up. */ - unsigned int :6; /* Remaining bits. */ + unsigned int :7; /* Remaining bits. */ volatile uint32_t *rq_db; volatile uint32_t *cq_db; uint16_t rq_ci;