All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Chen Jing D(Mark)" <jing.d.chen@intel.com>
To: dev@dpdk.org
Subject: [PATCH v4 04/16] fm10k: add func to re-allocate mbuf for RX ring
Date: Thu, 29 Oct 2015 17:16:01 +0800	[thread overview]
Message-ID: <1446110173-13330-5-git-send-email-jing.d.chen@intel.com> (raw)
In-Reply-To: <1446110173-13330-1-git-send-email-jing.d.chen@intel.com>

From: "Chen Jing D(Mark)" <jing.d.chen@intel.com>

Add function fm10k_rxq_rearm to re-allocate mbuf for used desc
in RX HW ring.

Signed-off-by: Chen Jing D(Mark) <jing.d.chen@intel.com>
---
 drivers/net/fm10k/fm10k.h          |   11 ++++
 drivers/net/fm10k/fm10k_ethdev.c   |    3 +
 drivers/net/fm10k/fm10k_rxtx_vec.c |   98 ++++++++++++++++++++++++++++++++++++
 3 files changed, 112 insertions(+), 0 deletions(-)

diff --git a/drivers/net/fm10k/fm10k.h b/drivers/net/fm10k/fm10k.h
index 362a2d0..5513644 100644
--- a/drivers/net/fm10k/fm10k.h
+++ b/drivers/net/fm10k/fm10k.h
@@ -123,6 +123,12 @@
 #define FM10K_VFTA_BIT(vlan_id)    (1 << ((vlan_id) & 0x1F))
 #define FM10K_VFTA_IDX(vlan_id)    ((vlan_id) >> 5)
 
+#define RTE_FM10K_RXQ_REARM_THRESH      32
+#define RTE_FM10K_VPMD_TX_BURST         32
+#define RTE_FM10K_MAX_RX_BURST          RTE_FM10K_RXQ_REARM_THRESH
+#define RTE_FM10K_TX_MAX_FREE_BUF_SZ    64
+#define RTE_FM10K_DESCS_PER_LOOP    4
+
 struct fm10k_macvlan_filter_info {
 	uint16_t vlan_num;       /* Total VLAN number */
 	uint16_t mac_num;        /* Total mac number */
@@ -171,6 +177,8 @@ struct fm10k_rx_queue {
 	struct rte_mbuf *pkt_last_seg;  /* Last segment of current packet. */
 	uint64_t hw_ring_phys_addr;
 	uint64_t mbuf_initializer; /* value to init mbufs */
+	/** need to alloc dummy mbuf, for wraparound when scanning hw ring */
+	struct rte_mbuf fake_mbuf;
 	uint16_t next_dd;
 	uint16_t next_alloc;
 	uint16_t next_trigger;
@@ -178,6 +186,9 @@ struct fm10k_rx_queue {
 	volatile uint32_t *tail_ptr;
 	uint16_t nb_desc;
 	uint16_t queue_id;
+	/* Below 2 fields only valid in case vPMD is applied. */
+	uint16_t rxrearm_nb;     /* number of remaining to be re-armed */
+	uint16_t rxrearm_start;  /* the idx we start the re-arming from */
 	uint8_t port_id;
 	uint8_t drop_en;
 	uint8_t rx_deferred_start; /* don't start this queue in dev start. */
diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
index 363ef98..44c3d34 100644
--- a/drivers/net/fm10k/fm10k_ethdev.c
+++ b/drivers/net/fm10k/fm10k_ethdev.c
@@ -121,6 +121,9 @@ rx_queue_reset(struct fm10k_rx_queue *q)
 	q->next_alloc = 0;
 	q->next_trigger = q->alloc_thresh - 1;
 	FM10K_PCI_REG_WRITE(q->tail_ptr, q->nb_desc - 1);
+	q->rxrearm_start = 0;
+	q->rxrearm_nb = 0;
+
 	return 0;
 }
 
diff --git a/drivers/net/fm10k/fm10k_rxtx_vec.c b/drivers/net/fm10k/fm10k_rxtx_vec.c
index 34b677b..6c21f15 100644
--- a/drivers/net/fm10k/fm10k_rxtx_vec.c
+++ b/drivers/net/fm10k/fm10k_rxtx_vec.c
@@ -64,3 +64,101 @@ fm10k_rxq_vec_setup(struct fm10k_rx_queue *rxq)
 	rxq->mbuf_initializer = *(uint64_t *)p;
 	return 0;
 }
+
+static inline void
+fm10k_rxq_rearm(struct fm10k_rx_queue *rxq)
+{
+	int i;
+	uint16_t rx_id;
+	volatile union fm10k_rx_desc *rxdp;
+	struct rte_mbuf **mb_alloc = &rxq->sw_ring[rxq->rxrearm_start];
+	struct rte_mbuf *mb0, *mb1;
+	__m128i head_off = _mm_set_epi64x(
+			RTE_PKTMBUF_HEADROOM + FM10K_RX_DATABUF_ALIGN - 1,
+			RTE_PKTMBUF_HEADROOM + FM10K_RX_DATABUF_ALIGN - 1);
+	__m128i dma_addr0, dma_addr1;
+	/* Rx buffer need to be aligned with 512 byte */
+	const __m128i hba_msk = _mm_set_epi64x(0,
+				UINT64_MAX - FM10K_RX_DATABUF_ALIGN + 1);
+
+	rxdp = rxq->hw_ring + rxq->rxrearm_start;
+
+	/* Pull 'n' more MBUFs into the software ring */
+	if (rte_mempool_get_bulk(rxq->mp,
+				 (void *)mb_alloc,
+				 RTE_FM10K_RXQ_REARM_THRESH) < 0) {
+		dma_addr0 = _mm_setzero_si128();
+		/* Clean up all the HW/SW ring content */
+		for (i = 0; i < RTE_FM10K_RXQ_REARM_THRESH; i++) {
+			mb_alloc[i] = &rxq->fake_mbuf;
+			_mm_store_si128((__m128i *)&rxdp[i].q,
+						dma_addr0);
+		}
+
+		rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed +=
+			RTE_FM10K_RXQ_REARM_THRESH;
+		return;
+	}
+
+	/* Initialize the mbufs in vector, process 2 mbufs in one loop */
+	for (i = 0; i < RTE_FM10K_RXQ_REARM_THRESH; i += 2, mb_alloc += 2) {
+		__m128i vaddr0, vaddr1;
+		uintptr_t p0, p1;
+
+		mb0 = mb_alloc[0];
+		mb1 = mb_alloc[1];
+
+		/* Flush mbuf with pkt template.
+		 * Data to be rearmed is 6 bytes long.
+		 * Though, RX will overwrite ol_flags that are coming next
+		 * anyway. So overwrite whole 8 bytes with one load:
+		 * 6 bytes of rearm_data plus first 2 bytes of ol_flags.
+		 */
+		p0 = (uintptr_t)&mb0->rearm_data;
+		*(uint64_t *)p0 = rxq->mbuf_initializer;
+		p1 = (uintptr_t)&mb1->rearm_data;
+		*(uint64_t *)p1 = rxq->mbuf_initializer;
+
+		/* load buf_addr(lo 64bit) and buf_physaddr(hi 64bit) */
+		vaddr0 = _mm_loadu_si128((__m128i *)&(mb0->buf_addr));
+		vaddr1 = _mm_loadu_si128((__m128i *)&(mb1->buf_addr));
+
+		/* convert pa to dma_addr hdr/data */
+		dma_addr0 = _mm_unpackhi_epi64(vaddr0, vaddr0);
+		dma_addr1 = _mm_unpackhi_epi64(vaddr1, vaddr1);
+
+		/* add headroom to pa values */
+		dma_addr0 = _mm_add_epi64(dma_addr0, head_off);
+		dma_addr1 = _mm_add_epi64(dma_addr1, head_off);
+
+		/* Do 512 byte alignment to satisfy HW requirement, in the
+		 * meanwhile, set Header Buffer Address to zero.
+		 */
+		dma_addr0 = _mm_and_si128(dma_addr0, hba_msk);
+		dma_addr1 = _mm_and_si128(dma_addr1, hba_msk);
+
+		/* flush desc with pa dma_addr */
+		_mm_store_si128((__m128i *)&rxdp++->q, dma_addr0);
+		_mm_store_si128((__m128i *)&rxdp++->q, dma_addr1);
+
+		/* enforce 512B alignment on default Rx virtual addresses */
+		mb0->data_off = (uint16_t)(RTE_PTR_ALIGN((char *)mb0->buf_addr
+				+ RTE_PKTMBUF_HEADROOM, FM10K_RX_DATABUF_ALIGN)
+				- (char *)mb0->buf_addr);
+		mb1->data_off = (uint16_t)(RTE_PTR_ALIGN((char *)mb1->buf_addr
+				+ RTE_PKTMBUF_HEADROOM, FM10K_RX_DATABUF_ALIGN)
+				- (char *)mb1->buf_addr);
+	}
+
+	rxq->rxrearm_start += RTE_FM10K_RXQ_REARM_THRESH;
+	if (rxq->rxrearm_start >= rxq->nb_desc)
+		rxq->rxrearm_start = 0;
+
+	rxq->rxrearm_nb -= RTE_FM10K_RXQ_REARM_THRESH;
+
+	rx_id = (uint16_t) ((rxq->rxrearm_start == 0) ?
+			     (rxq->nb_desc - 1) : (rxq->rxrearm_start - 1));
+
+	/* Update the tail pointer on the NIC */
+	FM10K_PCI_REG_WRITE(rxq->tail_ptr, rx_id);
+}
-- 
1.7.7.6

  parent reply	other threads:[~2015-10-29  9:16 UTC|newest]

Thread overview: 109+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-29 13:03 [PATCH 00/14] Vector Rx/Tx PMD implementation for fm10k Chen Jing D(Mark)
2015-09-29 13:03 ` [PATCH 01/14] fm10k: add new vPMD file Chen Jing D(Mark)
2015-10-22  9:44   ` [PATCH v2 00/16] Vector Rx/Tx PMD implementation for fm10k Chen Jing D(Mark)
2015-10-22  9:44     ` [PATCH v2 01/16] fm10k: add new vPMD file Chen Jing D(Mark)
2015-10-22 15:58       ` Stephen Hemminger
2015-10-23  8:39         ` Chen, Jing D
2015-10-23 10:01           ` Bruce Richardson
2015-10-27  5:26             ` Chen, Jing D
2015-10-27  9:46       ` [PATCH v3 00/16] Vector Rx/Tx PMD implementation for fm10k Chen Jing D(Mark)
2015-10-27  9:46         ` [PATCH v3 01/16] fm10k: add new vPMD file Chen Jing D(Mark)
2015-10-29  9:15           ` [PATCH v4 00/16] Vector Rx/Tx PMD implementation for fm10k Chen Jing D(Mark)
2015-10-29  9:15             ` [PATCH v4 01/16] fm10k: add new vPMD file Chen Jing D(Mark)
2015-10-30  8:02               ` [PATCH v5 00/14] Vector Rx/Tx PMD implementation for fm10k Chen Jing D(Mark)
2015-10-30  8:02                 ` [PATCH v5 01/14] fm10k: add new vPMD file Chen Jing D(Mark)
2015-10-30  8:02                 ` [PATCH v5 02/14] fm10k: add vPMD pre-condition check for each RX queue Chen Jing D(Mark)
2015-10-30  8:02                 ` [PATCH v5 03/14] fm10k: Add a new func to initialize all parameters Chen Jing D(Mark)
2015-10-30  8:02                 ` [PATCH v5 04/14] fm10k: add Vector RX function Chen Jing D(Mark)
2015-10-30  8:02                 ` [PATCH v5 05/14] fm10k: add func to do Vector RX condition check Chen Jing D(Mark)
2015-10-30  8:02                 ` [PATCH v5 06/14] fm10k: add Vector RX scatter function Chen Jing D(Mark)
2015-10-30  8:03                 ` [PATCH v5 07/14] fm10k: add function to decide best RX function Chen Jing D(Mark)
2015-10-30  8:03                 ` [PATCH v5 08/14] fm10k: add func to release mbuf in case Vector RX applied Chen Jing D(Mark)
2015-10-30  8:03                 ` [PATCH v5 09/14] fm10k: add Vector TX function Chen Jing D(Mark)
2015-10-30  8:03                 ` [PATCH v5 10/14] fm10k: use func pointer to reset TX queue and mbuf release Chen Jing D(Mark)
2015-10-30  8:03                 ` [PATCH v5 11/14] fm10k: introduce 2 funcs " Chen Jing D(Mark)
2015-10-30  8:03                 ` [PATCH v5 12/14] fm10k: Add function to decide best TX func Chen Jing D(Mark)
2015-10-30  8:03                 ` [PATCH v5 13/14] fm10k: fix a crash issue in vector RX func Chen Jing D(Mark)
2015-10-30  8:03                 ` [PATCH v5 14/14] doc: release notes update for fm10k Vector PMD Chen Jing D(Mark)
2015-11-02  8:36                   ` Thomas Monjalon
2015-10-30  8:26                 ` [PATCH v5 00/14] Vector Rx/Tx PMD implementation for fm10k Liang, Cunming
2015-11-02  8:38                   ` Thomas Monjalon
2015-10-29  9:15             ` [PATCH v4 02/16] fm10k: add vPMD pre-condition check for each RX queue Chen Jing D(Mark)
2015-10-29  9:16             ` [PATCH v4 03/16] fm10k: Add a new func to initialize all parameters Chen Jing D(Mark)
2015-10-29  9:16             ` Chen Jing D(Mark) [this message]
2015-10-29  9:16             ` [PATCH v4 05/16] fm10k: add 2 functions to parse pkt_type and offload flag Chen Jing D(Mark)
2015-10-29  9:16             ` [PATCH v4 06/16] fm10k: add Vector RX function Chen Jing D(Mark)
2015-10-29  9:16             ` [PATCH v4 07/16] fm10k: add func to do Vector RX condition check Chen Jing D(Mark)
2015-10-29  9:16             ` [PATCH v4 08/16] fm10k: add Vector RX scatter function Chen Jing D(Mark)
2015-10-29  9:16             ` [PATCH v4 09/16] fm10k: add function to decide best RX function Chen Jing D(Mark)
2015-10-29  9:16             ` [PATCH v4 10/16] fm10k: add func to release mbuf in case Vector RX applied Chen Jing D(Mark)
2015-10-29  9:16             ` [PATCH v4 11/16] fm10k: add Vector TX function Chen Jing D(Mark)
2015-10-29  9:16             ` [PATCH v4 12/16] fm10k: use func pointer to reset TX queue and mbuf release Chen Jing D(Mark)
2015-10-29  9:16             ` [PATCH v4 13/16] fm10k: introduce 2 funcs " Chen Jing D(Mark)
2015-10-29  9:16             ` [PATCH v4 14/16] fm10k: Add function to decide best TX func Chen Jing D(Mark)
2015-10-29  9:16             ` [PATCH v4 15/16] fm10k: fix a crash issue in vector RX func Chen Jing D(Mark)
2015-10-29  9:16             ` [PATCH v4 16/16] doc: release notes update for fm10k Vector PMD Chen Jing D(Mark)
2015-10-29 10:22             ` [PATCH v4 00/16] Vector Rx/Tx PMD implementation for fm10k Liang, Cunming
2015-10-29 23:12               ` Thomas Monjalon
2015-10-30  3:09                 ` Chen, Jing D
2015-10-27  9:46         ` [PATCH v3 02/16] fm10k: add vPMD pre-condition check for each RX queue Chen Jing D(Mark)
2015-10-27  9:46         ` [PATCH v3 03/16] fm10k: Add a new func to initialize all parameters Chen Jing D(Mark)
2015-10-27  9:46         ` [PATCH v3 04/16] fm10k: add func to re-allocate mbuf for RX ring Chen Jing D(Mark)
2015-10-28 13:58           ` Liang, Cunming
2015-10-29  5:24             ` Chen, Jing D
2015-10-29  8:14               ` Liang, Cunming
2015-10-29  8:37                 ` Chen, Jing D
2015-10-27  9:46         ` [PATCH v3 05/16] fm10k: add 2 functions to parse pkt_type and offload flag Chen Jing D(Mark)
2015-10-27  9:46         ` [PATCH v3 06/16] fm10k: add Vector RX function Chen Jing D(Mark)
2015-10-27  9:46         ` [PATCH v3 07/16] fm10k: add func to do Vector RX condition check Chen Jing D(Mark)
2015-10-27  9:46         ` [PATCH v3 08/16] fm10k: add Vector RX scatter function Chen Jing D(Mark)
2015-10-28 14:30           ` Liang, Cunming
2015-10-29  5:27             ` Chen, Jing D
2015-10-29  8:06               ` Liang, Cunming
2015-10-27  9:46         ` [PATCH v3 09/16] fm10k: add function to decide best RX function Chen Jing D(Mark)
2015-10-27  9:46         ` [PATCH v3 10/16] fm10k: add func to release mbuf in case Vector RX applied Chen Jing D(Mark)
2015-10-27  9:46         ` [PATCH v3 11/16] fm10k: add Vector TX function Chen Jing D(Mark)
2015-10-27  9:46         ` [PATCH v3 12/16] fm10k: use func pointer to reset TX queue and mbuf release Chen Jing D(Mark)
2015-10-27  9:46         ` [PATCH v3 13/16] fm10k: introduce 2 funcs " Chen Jing D(Mark)
2015-10-27  9:46         ` [PATCH v3 14/16] fm10k: Add function to decide best TX func Chen Jing D(Mark)
2015-10-27  9:46         ` [PATCH v3 15/16] fm10k: fix a crash issue in vector RX func Chen Jing D(Mark)
2015-10-27  9:46         ` [PATCH v3 16/16] doc: release notes update for fm10k Vector PMD Chen Jing D(Mark)
2015-10-22  9:44     ` [PATCH v2 02/16] fm10k: add vPMD pre-condition check for each RX queue Chen Jing D(Mark)
2015-10-22  9:44     ` [PATCH v2 03/16] fm10k: Add a new func to initialize all parameters Chen Jing D(Mark)
2015-10-22 15:57       ` Stephen Hemminger
2015-10-23  8:27         ` Chen, Jing D
2015-10-22  9:44     ` [PATCH v2 04/16] fm10k: add func to re-allocate mbuf for RX ring Chen Jing D(Mark)
2015-10-22  9:44     ` [PATCH v2 05/16] fm10k: add 2 functions to parse pkt_type and offload flag Chen Jing D(Mark)
2015-10-22  9:44     ` [PATCH v2 06/16] fm10k: add Vector RX function Chen Jing D(Mark)
2015-10-27  5:24       ` Liang, Cunming
2015-10-27  5:32         ` Chen, Jing D
2015-10-22  9:44     ` [PATCH v2 07/16] fm10k: add func to do Vector RX condition check Chen Jing D(Mark)
2015-10-22  9:44     ` [PATCH v2 08/16] fm10k: add Vector RX scatter function Chen Jing D(Mark)
2015-10-27  5:27       ` Liang, Cunming
2015-10-27  5:43         ` Chen, Jing D
2015-10-27  5:55           ` Chen, Jing D
2015-10-22  9:44     ` [PATCH v2 09/16] fm10k: add function to decide best RX function Chen Jing D(Mark)
2015-10-22  9:44     ` [PATCH v2 10/16] fm10k: add func to release mbuf in case Vector RX applied Chen Jing D(Mark)
2015-10-22  9:44     ` [PATCH v2 11/16] fm10k: add Vector TX function Chen Jing D(Mark)
2015-10-22  9:45     ` [PATCH v2 12/16] fm10k: use func pointer to reset TX queue and mbuf release Chen Jing D(Mark)
2015-10-22  9:45     ` [PATCH v2 13/16] fm10k: introduce 2 funcs " Chen Jing D(Mark)
2015-10-22  9:45     ` [PATCH v2 14/16] fm10k: Add function to decide best TX func Chen Jing D(Mark)
2015-10-22  9:45     ` [PATCH v2 15/16] fm10k: fix a crash issue in vector RX func Chen Jing D(Mark)
2015-10-22  9:45     ` [PATCH v2 16/16] doc: release notes update for fm10k Vector PMD Chen Jing D(Mark)
2015-09-29 13:03 ` [PATCH 02/14] fm10k: add vPMD pre-condition check for each RX queue Chen Jing D(Mark)
2015-09-29 13:03 ` [PATCH 03/14] fm10k: Add a new func to initialize all parameters Chen Jing D(Mark)
2015-09-29 13:03 ` [PATCH 04/14] fm10k: add func to re-allocate mbuf for RX ring Chen Jing D(Mark)
2015-09-29 13:03 ` [PATCH 05/14] fm10k: add 2 functions to parse pkt_type and offload flag Chen Jing D(Mark)
2015-09-29 13:03 ` [PATCH 06/14] fm10k: add Vector RX function Chen Jing D(Mark)
2015-09-29 13:14   ` Ananyev, Konstantin
2015-09-29 14:22     ` Bruce Richardson
2015-09-30 13:23       ` Chen, Jing D
2015-09-30 13:18     ` Chen, Jing D
2015-09-29 13:03 ` [PATCH 07/14] fm10k: add func to do Vector RX condition check Chen Jing D(Mark)
2015-09-29 13:03 ` [PATCH 08/14] fm10k: add Vector RX scatter function Chen Jing D(Mark)
2015-09-29 13:03 ` [PATCH 09/14] fm10k: add function to decide best RX function Chen Jing D(Mark)
2015-09-29 13:03 ` [PATCH 10/14] fm10k: add func to release mbuf in case Vector RX applied Chen Jing D(Mark)
2015-09-29 13:03 ` [PATCH 11/14] fm10k: add Vector TX function Chen Jing D(Mark)
2015-09-29 13:03 ` [PATCH 12/14] fm10k: use func pointer to reset TX queue and mbuf release Chen Jing D(Mark)
2015-09-29 13:03 ` [PATCH 13/14] fm10k: introduce 2 funcs " Chen Jing D(Mark)
2015-09-29 13:03 ` [PATCH 14/14] fm10k: Add function to decide best TX func Chen Jing D(Mark)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1446110173-13330-5-git-send-email-jing.d.chen@intel.com \
    --to=jing.d.chen@intel.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.