From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f46.google.com (mail-wm0-f46.google.com [74.125.82.46]) by dpdk.org (Postfix) with ESMTP id 72B5F2C0B for ; Thu, 3 Mar 2016 15:27:45 +0100 (CET) Received: by mail-wm0-f46.google.com with SMTP id p65so37291491wmp.1 for ; Thu, 03 Mar 2016 06:27:45 -0800 (PST) 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; bh=VYLjBKpat7Igi/D1Cpjo6wH6AyOdSOj/mAPXXzjQP1I=; b=kHK7tQ79c+XwAp2Imp/I5EzFGmeB8ySgmEmc4h+B0zAGtAoFmXcZPkvaHxrsudkAsD edbt+pb8WUcmtP4IXWIR7ZHRFPwA9otGMsarZn/VGv6FlAAkTuxm9SINUqlCCdCb3+ta tOG3KNqrmUqJk6XRQi5z7hZ6aBUsLcpmuyxlBy8j44irlxLMQ6LOPfykn9URJ71Gu/By Tq3Pi0IN1JzWWMMGBbnROswS2UkJCEKCsFTY01vSU0Znphao0lrl5S9wsyv1NVowA2Rl VGmRIYdmjLdcT6nv0Gev/ySra+qUjhbYE3YkGVTQOXY1FoTkmpWWUPRkJBoWtgAeVlMT aUHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=VYLjBKpat7Igi/D1Cpjo6wH6AyOdSOj/mAPXXzjQP1I=; b=V9cCfZZq0dELoC6U8aQnm6SV/tjw6LaIkJHgHb+hOrodXk4x+Pj85i1vrQ4has7tth xvrve5VYBvWO2dZtt+8wcgkgxUB3cKmlwxkt3wOvF204+L6OgWmq+nZgIuCGiB1wkoVo aRWsmUWKYIjymRfjOjxLzeCQ+4EhFdDMbiI2bX2moxwQVqnBCGuR6eRm8ArinytPL/vR xRtLDRLlwauRZjxR9WwFqC99TkMHnbjs4IbgR3dxoKqwZlHKUL4yUbK7H7aQU3Ap3v1y 3EKfZ3kRJPU9KgeamQB18N36Ckjh8mN7EekC//4KG9STx4kuv4qnDbMIF5N1tsOxPCAT XuXQ== X-Gm-Message-State: AD7BkJJkTaqMnhlEZhLz5hVqUVyl1iRpugNbKRosf/sECoNHW7l4VfNkObtXgaSODzr5QFT8 X-Received: by 10.28.50.133 with SMTP id y127mr6084793wmy.4.1457015265267; Thu, 03 Mar 2016 06:27:45 -0800 (PST) Received: from 6wind.com (guy78-3-82-239-227-177.fbx.proxad.net. [82.239.227.177]) by smtp.gmail.com with ESMTPSA id q139sm9269726wmd.2.2016.03.03.06.27.44 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 03 Mar 2016 06:27:44 -0800 (PST) From: Adrien Mazarguil To: dev@dpdk.org Date: Thu, 3 Mar 2016 15:27:16 +0100 Message-Id: <1457015237-2993-7-git-send-email-adrien.mazarguil@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1457015237-2993-1-git-send-email-adrien.mazarguil@6wind.com> References: <1456165083-28316-1-git-send-email-adrien.mazarguil@6wind.com> <1457015237-2993-1-git-send-email-adrien.mazarguil@6wind.com> Subject: [dpdk-dev] [PATCH v3 6/7] mlx5: free buffers immediately after completion X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 03 Mar 2016 14:27:45 -0000 From: Nelio Laranjeiro This lowers the amount of cache misses. Signed-off-by: Nelio Laranjeiro --- drivers/net/mlx5/mlx5_rxtx.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c index b82017e..622ac17 100644 --- a/drivers/net/mlx5/mlx5_rxtx.c +++ b/drivers/net/mlx5/mlx5_rxtx.c @@ -84,6 +84,7 @@ txq_complete(struct txq *txq) { unsigned int elts_comp = txq->elts_comp; unsigned int elts_tail = txq->elts_tail; + unsigned int elts_free = txq->elts_tail; const unsigned int elts_n = txq->elts_n; int wcs_n; @@ -110,6 +111,25 @@ txq_complete(struct txq *txq) elts_tail += wcs_n * txq->elts_comp_cd_init; if (elts_tail >= elts_n) elts_tail -= elts_n; + + while (elts_free != elts_tail) { + struct txq_elt *elt = &(*txq->elts)[elts_free]; + unsigned int elts_free_next = + (((elts_free + 1) == elts_n) ? 0 : elts_free + 1); + struct rte_mbuf *tmp = elt->buf; + struct txq_elt *elt_next = &(*txq->elts)[elts_free_next]; + + RTE_MBUF_PREFETCH_TO_FREE(elt_next->buf); + /* Faster than rte_pktmbuf_free(). */ + do { + struct rte_mbuf *next = NEXT(tmp); + + rte_pktmbuf_free_seg(tmp); + tmp = next; + } while (tmp != NULL); + elts_free = elts_free_next; + } + txq->elts_tail = elts_tail; txq->elts_comp = elts_comp; return 0; @@ -464,7 +484,6 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n) struct rte_mbuf *buf_next = pkts[i + 1]; unsigned int elts_head_next = (((elts_head + 1) == elts_n) ? 0 : elts_head + 1); - struct txq_elt *elt_next = &(*txq->elts)[elts_head_next]; struct txq_elt *elt = &(*txq->elts)[elts_head]; unsigned int segs = NB_SEGS(buf); #ifdef MLX5_PMD_SOFT_COUNTERS @@ -472,18 +491,6 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n) #endif uint32_t send_flags = 0; - /* Clean up old buffer. */ - if (likely(elt->buf != NULL)) { - struct rte_mbuf *tmp = elt->buf; - - /* Faster than rte_pktmbuf_free(). */ - do { - struct rte_mbuf *next = NEXT(tmp); - - rte_pktmbuf_free_seg(tmp); - tmp = next; - } while (tmp != NULL); - } if (i + 1 < max) rte_prefetch0(buf_next); /* Request TX completion. */ @@ -517,7 +524,6 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n) if (txq->priv->vf) rte_prefetch0((volatile void *) (uintptr_t)addr); - RTE_MBUF_PREFETCH_TO_FREE(elt_next->buf); /* Prefetch next buffer data. */ if (i + 1 < max) { buf_next_addr = @@ -568,7 +574,6 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n) &sges); if (ret.length == (unsigned int)-1) goto stop; - RTE_MBUF_PREFETCH_TO_FREE(elt_next->buf); /* Put SG list into send queue. */ err = txq->send_pending_sg_list (txq->qp, -- 2.1.4