From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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: , X-List-Received-Date: Wed, 23 Aug 2017 08:15:37 -0000 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; -- 2.1.4