DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH v4 1/3] bnx2x: refactor Tx routine for single doorbell mechanism
@ 2016-05-04  5:38 Rasesh Mody
  2016-05-04  5:38 ` [dpdk-dev] [PATCH v4 2/3] bnx2x: enhance stats get Rasesh Mody
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Rasesh Mody @ 2016-05-04  5:38 UTC (permalink / raw)
  To: dev; +Cc: Dept-EngDPDKDev, Rasesh Mody, Harish Patil

Change the Tx routine logic to ring the doorbell once per burst and not
on every Tx packet. This driver-level optimization is necessary to achieve
line rates for larger frame sizes (1k or more).

Fixes: 540a211084a7 ("bnx2x: driver core")

Signed-off-by: Rasesh Mody <rasesh.mody@qlogic.com>
Signed-off-by: Harish Patil <harish.patil@qlogic.com>
---
 drivers/net/bnx2x/bnx2x.c      |  207 ++++++++++++++++++----------------------
 drivers/net/bnx2x/bnx2x.h      |    4 +-
 drivers/net/bnx2x/bnx2x_rxtx.c |   45 ++++-----
 3 files changed, 118 insertions(+), 138 deletions(-)

diff --git a/drivers/net/bnx2x/bnx2x.c b/drivers/net/bnx2x/bnx2x.c
index 6edb2f9..149fdef 100644
--- a/drivers/net/bnx2x/bnx2x.c
+++ b/drivers/net/bnx2x/bnx2x.c
@@ -1293,7 +1293,7 @@ bnx2x_free_tx_pkt(__rte_unused struct bnx2x_fastpath *fp, struct bnx2x_tx_queue
 	struct rte_mbuf *tx_mbuf = txq->sw_ring[TX_BD(pkt_idx, txq)];
 
 	if (likely(tx_mbuf != NULL)) {
-		rte_pktmbuf_free(tx_mbuf);
+		rte_pktmbuf_free_seg(tx_mbuf);
 	} else {
 		PMD_RX_LOG(ERR, "fp[%02d] lost mbuf %lu",
 			   fp->index, (unsigned long)TX_BD(pkt_idx, txq));
@@ -2113,147 +2113,128 @@ bnx2x_nic_unload(struct bnx2x_softc *sc, uint32_t unload_mode, uint8_t keep_link
  * the mbuf and return to the caller.
  *
  * Returns:
- *   0 = Success, !0 = Failure
+ *   Number of TX BDs used for the mbuf
  *   Note the side effect that an mbuf may be freed if it causes a problem.
  */
-int bnx2x_tx_encap(struct bnx2x_tx_queue *txq, struct rte_mbuf **m_head, int m_pkts)
+uint32_t
+bnx2x_tx_encap(struct bnx2x_tx_queue *txq, struct rte_mbuf *m0)
 {
-	struct rte_mbuf *m0;
 	struct eth_tx_start_bd *tx_start_bd;
 	uint16_t bd_prod, pkt_prod;
-	int m_tx;
 	struct bnx2x_softc *sc;
 	uint32_t nbds = 0;
-	struct bnx2x_fastpath *fp;
 
 	sc = txq->sc;
-	fp = &sc->fp[txq->queue_id];
 
 	bd_prod = txq->tx_bd_tail;
 	pkt_prod = txq->tx_pkt_tail;
 
-	for (m_tx = 0; m_tx < m_pkts; m_tx++) {
+	txq->sw_ring[TX_BD(pkt_prod, txq)] = m0;
 
-		m0 = *m_head++;
+	tx_start_bd = &txq->tx_ring[TX_BD(bd_prod, txq)].start_bd;
 
-		if (unlikely(txq->nb_tx_avail < 3)) {
-			PMD_TX_LOG(ERR, "no enough bds %d/%d",
-				   bd_prod, txq->nb_tx_avail);
-			return -ENOMEM;
-		}
+	tx_start_bd->addr =
+	    rte_cpu_to_le_64(rte_mbuf_data_dma_addr(m0));
+	tx_start_bd->nbytes = rte_cpu_to_le_16(m0->data_len);
+	tx_start_bd->bd_flags.as_bitfield = ETH_TX_BD_FLAGS_START_BD;
+	tx_start_bd->general_data =
+	    (1 << ETH_TX_START_BD_HDR_NBDS_SHIFT);
 
-		txq->sw_ring[TX_BD(pkt_prod, txq)] = m0;
+	tx_start_bd->nbd = rte_cpu_to_le_16(2);
 
-		tx_start_bd = &txq->tx_ring[TX_BD(bd_prod, txq)].start_bd;
-
-		tx_start_bd->addr =
-		    rte_cpu_to_le_64(rte_mbuf_data_dma_addr(m0));
-		tx_start_bd->nbytes = rte_cpu_to_le_16(m0->data_len);
-		tx_start_bd->bd_flags.as_bitfield = ETH_TX_BD_FLAGS_START_BD;
-		tx_start_bd->general_data =
-		    (1 << ETH_TX_START_BD_HDR_NBDS_SHIFT);
-
-		tx_start_bd->nbd = rte_cpu_to_le_16(2);
+	if (m0->ol_flags & PKT_TX_VLAN_PKT) {
+		tx_start_bd->vlan_or_ethertype =
+		    rte_cpu_to_le_16(m0->vlan_tci);
+		tx_start_bd->bd_flags.as_bitfield |=
+		    (X_ETH_OUTBAND_VLAN <<
+		     ETH_TX_BD_FLAGS_VLAN_MODE_SHIFT);
+	} else {
+		if (IS_PF(sc))
+			tx_start_bd->vlan_or_ethertype =
+			    rte_cpu_to_le_16(pkt_prod);
+		else {
+			struct ether_hdr *eh =
+				rte_pktmbuf_mtod(m0, struct ether_hdr *);
 
-		if (m0->ol_flags & PKT_TX_VLAN_PKT) {
 			tx_start_bd->vlan_or_ethertype =
-			    rte_cpu_to_le_16(m0->vlan_tci);
-			tx_start_bd->bd_flags.as_bitfield |=
-			    (X_ETH_OUTBAND_VLAN <<
-			     ETH_TX_BD_FLAGS_VLAN_MODE_SHIFT);
-		} else {
-			if (IS_PF(sc))
-				tx_start_bd->vlan_or_ethertype =
-				    rte_cpu_to_le_16(pkt_prod);
-			else {
-				struct ether_hdr *eh
-				    = rte_pktmbuf_mtod(m0, struct ether_hdr *);
-
-				tx_start_bd->vlan_or_ethertype
-				    = rte_cpu_to_le_16(rte_be_to_cpu_16(eh->ether_type));
-			}
+			     rte_cpu_to_le_16(rte_be_to_cpu_16(eh->ether_type));
 		}
+	}
 
-		bd_prod = NEXT_TX_BD(bd_prod);
-		if (IS_VF(sc)) {
-			struct eth_tx_parse_bd_e2 *tx_parse_bd;
-			const struct ether_hdr *eh = rte_pktmbuf_mtod(m0, struct ether_hdr *);
-			uint8_t mac_type = UNICAST_ADDRESS;
-
-			tx_parse_bd =
-			    &txq->tx_ring[TX_BD(bd_prod, txq)].parse_bd_e2;
-			if (is_multicast_ether_addr(&eh->d_addr)) {
-				if (is_broadcast_ether_addr(&eh->d_addr))
-					mac_type = BROADCAST_ADDRESS;
-				else
-					mac_type = MULTICAST_ADDRESS;
-			}
-			tx_parse_bd->parsing_data =
-			    (mac_type << ETH_TX_PARSE_BD_E2_ETH_ADDR_TYPE_SHIFT);
-
-			rte_memcpy(&tx_parse_bd->data.mac_addr.dst_hi,
-				   &eh->d_addr.addr_bytes[0], 2);
-			rte_memcpy(&tx_parse_bd->data.mac_addr.dst_mid,
-				   &eh->d_addr.addr_bytes[2], 2);
-			rte_memcpy(&tx_parse_bd->data.mac_addr.dst_lo,
-				   &eh->d_addr.addr_bytes[4], 2);
-			rte_memcpy(&tx_parse_bd->data.mac_addr.src_hi,
-				   &eh->s_addr.addr_bytes[0], 2);
-			rte_memcpy(&tx_parse_bd->data.mac_addr.src_mid,
-				   &eh->s_addr.addr_bytes[2], 2);
-			rte_memcpy(&tx_parse_bd->data.mac_addr.src_lo,
-				   &eh->s_addr.addr_bytes[4], 2);
-
-			tx_parse_bd->data.mac_addr.dst_hi =
-			    rte_cpu_to_be_16(tx_parse_bd->data.mac_addr.dst_hi);
-			tx_parse_bd->data.mac_addr.dst_mid =
-			    rte_cpu_to_be_16(tx_parse_bd->data.
-					     mac_addr.dst_mid);
-			tx_parse_bd->data.mac_addr.dst_lo =
-			    rte_cpu_to_be_16(tx_parse_bd->data.mac_addr.dst_lo);
-			tx_parse_bd->data.mac_addr.src_hi =
-			    rte_cpu_to_be_16(tx_parse_bd->data.mac_addr.src_hi);
-			tx_parse_bd->data.mac_addr.src_mid =
-			    rte_cpu_to_be_16(tx_parse_bd->data.
-					     mac_addr.src_mid);
-			tx_parse_bd->data.mac_addr.src_lo =
-			    rte_cpu_to_be_16(tx_parse_bd->data.mac_addr.src_lo);
-
-			PMD_TX_LOG(DEBUG,
-				   "PBD dst %x %x %x src %x %x %x p_data %x",
-				   tx_parse_bd->data.mac_addr.dst_hi,
-				   tx_parse_bd->data.mac_addr.dst_mid,
-				   tx_parse_bd->data.mac_addr.dst_lo,
-				   tx_parse_bd->data.mac_addr.src_hi,
-				   tx_parse_bd->data.mac_addr.src_mid,
-				   tx_parse_bd->data.mac_addr.src_lo,
-				   tx_parse_bd->parsing_data);
-		}
+	bd_prod = NEXT_TX_BD(bd_prod);
+	if (IS_VF(sc)) {
+		struct eth_tx_parse_bd_e2 *tx_parse_bd;
+		const struct ether_hdr *eh =
+				rte_pktmbuf_mtod(m0, struct ether_hdr *);
+		uint8_t mac_type = UNICAST_ADDRESS;
+
+		tx_parse_bd =
+			&txq->tx_ring[TX_BD(bd_prod, txq)].parse_bd_e2;
+		if (is_multicast_ether_addr(&eh->d_addr)) {
+			if (is_broadcast_ether_addr(&eh->d_addr))
+				mac_type = BROADCAST_ADDRESS;
+			else
+				mac_type = MULTICAST_ADDRESS;
+		}
+		tx_parse_bd->parsing_data =
+			   (mac_type << ETH_TX_PARSE_BD_E2_ETH_ADDR_TYPE_SHIFT);
+
+		rte_memcpy(&tx_parse_bd->data.mac_addr.dst_hi,
+			   &eh->d_addr.addr_bytes[0], 2);
+		rte_memcpy(&tx_parse_bd->data.mac_addr.dst_mid,
+			   &eh->d_addr.addr_bytes[2], 2);
+		rte_memcpy(&tx_parse_bd->data.mac_addr.dst_lo,
+			   &eh->d_addr.addr_bytes[4], 2);
+		rte_memcpy(&tx_parse_bd->data.mac_addr.src_hi,
+			   &eh->s_addr.addr_bytes[0], 2);
+		rte_memcpy(&tx_parse_bd->data.mac_addr.src_mid,
+			   &eh->s_addr.addr_bytes[2], 2);
+		rte_memcpy(&tx_parse_bd->data.mac_addr.src_lo,
+			   &eh->s_addr.addr_bytes[4], 2);
+
+		tx_parse_bd->data.mac_addr.dst_hi =
+		    rte_cpu_to_be_16(tx_parse_bd->data.mac_addr.dst_hi);
+		tx_parse_bd->data.mac_addr.dst_mid =
+		    rte_cpu_to_be_16(tx_parse_bd->data.
+				     mac_addr.dst_mid);
+		tx_parse_bd->data.mac_addr.dst_lo =
+		    rte_cpu_to_be_16(tx_parse_bd->data.mac_addr.dst_lo);
+		tx_parse_bd->data.mac_addr.src_hi =
+		    rte_cpu_to_be_16(tx_parse_bd->data.mac_addr.src_hi);
+		tx_parse_bd->data.mac_addr.src_mid =
+		    rte_cpu_to_be_16(tx_parse_bd->data.
+				     mac_addr.src_mid);
+		tx_parse_bd->data.mac_addr.src_lo =
+		    rte_cpu_to_be_16(tx_parse_bd->data.mac_addr.src_lo);
 
 		PMD_TX_LOG(DEBUG,
-			   "start bd: nbytes %d flags %x vlan %x\n",
-			   tx_start_bd->nbytes,
-			   tx_start_bd->bd_flags.as_bitfield,
-			   tx_start_bd->vlan_or_ethertype);
+			   "PBD dst %x %x %x src %x %x %x p_data %x",
+			   tx_parse_bd->data.mac_addr.dst_hi,
+			   tx_parse_bd->data.mac_addr.dst_mid,
+			   tx_parse_bd->data.mac_addr.dst_lo,
+			   tx_parse_bd->data.mac_addr.src_hi,
+			   tx_parse_bd->data.mac_addr.src_mid,
+			   tx_parse_bd->data.mac_addr.src_lo,
+			   tx_parse_bd->parsing_data);
+	}
 
-		bd_prod = NEXT_TX_BD(bd_prod);
-		pkt_prod++;
+	PMD_TX_LOG(DEBUG,
+		   "start bd: nbytes %d flags %x vlan %x\n",
+		   tx_start_bd->nbytes,
+		   tx_start_bd->bd_flags.as_bitfield,
+		   tx_start_bd->vlan_or_ethertype);
 
-		if (TX_IDX(bd_prod) < 2) {
-			nbds++;
-		}
-	}
+	bd_prod = NEXT_TX_BD(bd_prod);
+	pkt_prod++;
+
+	if (TX_IDX(bd_prod) < 2)
+		nbds++;
 
-	txq->nb_tx_avail -= m_pkts << 1;
+	txq->nb_tx_avail -= 1 << 1;
 	txq->tx_bd_tail = bd_prod;
 	txq->tx_pkt_tail = pkt_prod;
 
-	mb();
-	fp->tx_db.data.prod += (m_pkts << 1) + nbds;
-	DOORBELL(sc, txq->queue_id, fp->tx_db.raw);
-	mb();
-
-	return 0;
+	return nbds + 2;
 }
 
 static uint16_t bnx2x_cid_ilt_lines(struct bnx2x_softc *sc)
diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h
index 135a6eb..b3a3866 100644
--- a/drivers/net/bnx2x/bnx2x.h
+++ b/drivers/net/bnx2x/bnx2x.h
@@ -167,6 +167,8 @@ struct bnx2x_device_type {
 #define TX_PAGE(x)              (((x) & ~USABLE_TX_BD_PER_PAGE) >> 8)
 #define TX_IDX(x)               ((x) & USABLE_TX_BD_PER_PAGE)
 
+#define BDS_PER_TX_PKT		(3)
+
 /*
  * Trigger pending transmits when the number of available BDs is greater
  * than 1/8 of the total number of usable BDs.
@@ -1864,7 +1866,7 @@ int bnx2x_alloc_hsi_mem(struct bnx2x_softc *sc);
 int bnx2x_alloc_ilt_mem(struct bnx2x_softc *sc);
 void bnx2x_free_ilt_mem(struct bnx2x_softc *sc);
 void bnx2x_dump_tx_chain(struct bnx2x_fastpath * fp, int bd_prod, int count);
-int bnx2x_tx_encap(struct bnx2x_tx_queue *txq, struct rte_mbuf **m_head, int m_pkts);
+uint32_t bnx2x_tx_encap(struct bnx2x_tx_queue *txq, struct rte_mbuf *m0);
 uint8_t bnx2x_txeof(struct bnx2x_softc *sc, struct bnx2x_fastpath *fp);
 void bnx2x_print_adapter_info(struct bnx2x_softc *sc);
 int bnx2x_intr_legacy(struct bnx2x_softc *sc, int scan_fp);
diff --git a/drivers/net/bnx2x/bnx2x_rxtx.c b/drivers/net/bnx2x/bnx2x_rxtx.c
index 752a5e8..8b047d4 100644
--- a/drivers/net/bnx2x/bnx2x_rxtx.c
+++ b/drivers/net/bnx2x/bnx2x_rxtx.c
@@ -222,40 +222,37 @@ bnx2x_xmit_pkts(void *p_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 	struct bnx2x_tx_queue *txq;
 	struct bnx2x_softc *sc;
 	struct bnx2x_fastpath *fp;
-	uint32_t burst, nb_tx;
-	struct rte_mbuf **m = tx_pkts;
-	int ret;
+	uint32_t ret;
+	uint16_t nb_tx_pkts;
+	uint16_t nb_pkt_sent = 0;
 
 	txq = p_txq;
 	sc = txq->sc;
 	fp = &sc->fp[txq->queue_id];
 
-	nb_tx = nb_pkts;
+	if ((unlikely((txq->nb_tx_desc - txq->nb_tx_avail) >
+					txq->tx_free_thresh)))
+		bnx2x_txeof(sc, fp);
 
-	do {
-		burst = RTE_MIN(nb_pkts, RTE_PMD_BNX2X_TX_MAX_BURST);
+	nb_tx_pkts = RTE_MIN(nb_pkts, txq->nb_tx_avail / BDS_PER_TX_PKT);
 
-		ret = bnx2x_tx_encap(txq, m, burst);
-		if (unlikely(ret)) {
-			PMD_TX_LOG(ERR, "tx_encap failed!");
-		}
-
-		bnx2x_update_fp_sb_idx(fp);
-
-		if ((txq->nb_tx_desc - txq->nb_tx_avail) > txq->tx_free_thresh) {
-			bnx2x_txeof(sc, fp);
-		}
-
-		if (unlikely(ret == -ENOMEM)) {
-			break;
-		}
+	if (unlikely(nb_tx_pkts == 0))
+		return 0;
 
-		m += burst;
-		nb_pkts -= burst;
+	while (nb_tx_pkts--) {
+		struct rte_mbuf *m = *tx_pkts++;
+		assert(m != NULL);
+		ret = bnx2x_tx_encap(txq, m);
+		fp->tx_db.data.prod += ret;
+		nb_pkt_sent++;
+	}
 
-	} while (nb_pkts);
+	bnx2x_update_fp_sb_idx(fp);
+	mb();
+	DOORBELL(sc, txq->queue_id, fp->tx_db.raw);
+	mb();
 
-	return nb_tx - nb_pkts;
+	return nb_pkt_sent;
 }
 
 int
-- 
1.7.10.3

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [dpdk-dev] [PATCH v4 2/3] bnx2x: enhance stats get
  2016-05-04  5:38 [dpdk-dev] [PATCH v4 1/3] bnx2x: refactor Tx routine for single doorbell mechanism Rasesh Mody
@ 2016-05-04  5:38 ` Rasesh Mody
  2016-05-06 14:47   ` Bruce Richardson
  2016-05-04  5:38 ` [dpdk-dev] [PATCH v4 3/3] bnx2x: update PMD version to 1.0.1.1 Rasesh Mody
  2016-05-06 14:45 ` [dpdk-dev] [PATCH v4 1/3] bnx2x: refactor Tx routine for single doorbell mechanism Bruce Richardson
  2 siblings, 1 reply; 10+ messages in thread
From: Rasesh Mody @ 2016-05-04  5:38 UTC (permalink / raw)
  To: dev; +Cc: Dept-EngDPDKDev, Rasesh Mody, Harish Patil

Enhance the stats_get() routine to display drop counters under
imissed counter.
Added extended stats get support to provide additional info.
Encorporated review comment to rename some of the stats.

Signed-off-by: Rasesh Mody <rasesh.mody@qlogic.com>
Signed-off-by: Harish Patil <harish.patil@qlogic.com>
---
 doc/guides/nics/overview.rst     |    2 +-
 drivers/net/bnx2x/bnx2x_ethdev.c |   76 ++++++++++++++++++++++++++++++++++++++
 drivers/net/bnx2x/bnx2x_rxtx.c   |    2 +
 3 files changed, 79 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/overview.rst b/doc/guides/nics/overview.rst
index f08039e..70b0caf 100644
--- a/doc/guides/nics/overview.rst
+++ b/doc/guides/nics/overview.rst
@@ -128,7 +128,7 @@ Most of these differences are summarized below.
    Packet type parsing          Y     Y Y   Y   Y Y Y   Y   Y Y Y Y Y Y
    Timesync                             Y Y     Y   Y Y
    Basic stats            Y Y   Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y       Y   Y Y Y Y
-   Extended stats                   Y   Y Y Y Y Y Y Y Y Y Y Y Y Y Y                   Y Y
+   Extended stats         Y Y       Y   Y Y Y Y Y Y Y Y Y Y Y Y Y Y                   Y Y
    Stats per queue              Y                   Y Y     Y Y Y Y Y Y           Y   Y Y
    EEPROM dump                                  Y   Y Y
    Registers dump                               Y Y Y Y Y Y
diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
index 071b44f..062ffbc 100644
--- a/drivers/net/bnx2x/bnx2x_ethdev.c
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c
@@ -276,6 +276,9 @@ static void
 bnx2x_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
 	struct bnx2x_softc *sc = dev->data->dev_private;
+	uint32_t brb_truncate_discard;
+	uint64_t brb_drops;
+	uint64_t brb_truncates;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -316,6 +319,77 @@ bnx2x_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 	stats->rx_nombuf =
 		HILO_U64(sc->eth_stats.no_buff_discard_hi,
 				sc->eth_stats.no_buff_discard_lo);
+
+	brb_drops =
+		HILO_U64(sc->eth_stats.brb_drop_hi,
+			 sc->eth_stats.brb_drop_lo);
+
+	brb_truncates =
+		HILO_U64(sc->eth_stats.brb_truncate_hi,
+			 sc->eth_stats.brb_truncate_lo);
+
+	brb_truncate_discard = sc->eth_stats.brb_truncate_discard;
+
+	stats->imissed = brb_drops + brb_truncates +
+			 brb_truncate_discard + stats->rx_nombuf;
+}
+
+#define BNX2X_EXTENDED_STATS 9
+
+static int
+bnx2x_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstats *xstats,
+		     unsigned int n)
+{
+	struct bnx2x_softc *sc = dev->data->dev_private;
+	unsigned int num = BNX2X_EXTENDED_STATS;
+
+	if (n < num)
+		return num;
+
+	num = 0;
+
+	bnx2x_stats_handle(sc, STATS_EVENT_UPDATE);
+
+	snprintf(xstats[num].name, sizeof(xstats[num].name), "rx_buf_drops");
+	xstats[num++].value = HILO_U64(sc->eth_stats.brb_drop_hi,
+				       sc->eth_stats.brb_drop_lo);
+
+	snprintf(xstats[num].name, sizeof(xstats[num].name),
+		 "rx_buf_truncates");
+	xstats[num++].value = HILO_U64(sc->eth_stats.brb_truncate_hi,
+				       sc->eth_stats.brb_truncate_lo);
+
+	snprintf(xstats[num].name, sizeof(xstats[num].name),
+		 "rx_buf_truncate_discard");
+	xstats[num++].value = sc->eth_stats.brb_truncate_discard;
+
+	snprintf(xstats[num].name, sizeof(xstats[num].name),
+		 "mac_filter_discard");
+	xstats[num++].value = sc->eth_stats.mac_filter_discard;
+
+	snprintf(xstats[num].name, sizeof(xstats[num].name),
+		 "no_match_vlan_tag_discard");
+	xstats[num++].value = sc->eth_stats.mf_tag_discard;
+
+	snprintf(xstats[num].name, sizeof(xstats[num].name), "tx_pause");
+	xstats[num++].value = HILO_U64(sc->eth_stats.pause_frames_sent_hi,
+				       sc->eth_stats.pause_frames_sent_lo);
+
+	snprintf(xstats[num].name, sizeof(xstats[num].name), "rx_pause");
+	xstats[num++].value = HILO_U64(sc->eth_stats.pause_frames_received_hi,
+				       sc->eth_stats.pause_frames_received_lo);
+
+	snprintf(xstats[num].name, sizeof(xstats[num].name),
+		 "tx_prio_flow_ctrl");
+	xstats[num++].value = HILO_U64(sc->eth_stats.pfc_frames_sent_hi,
+				       sc->eth_stats.pfc_frames_sent_lo);
+
+	snprintf(xstats[num].name, sizeof(xstats[num].name),
+		 "rx_prio_flow_ctrl");
+	xstats[num++].value = HILO_U64(sc->eth_stats.pfc_frames_received_hi,
+				       sc->eth_stats.pfc_frames_received_lo);
+
+	return num;
 }
 
 static void
@@ -360,6 +434,7 @@ static const struct eth_dev_ops bnx2x_eth_dev_ops = {
 	.allmulticast_disable         = bnx2x_dev_allmulticast_disable,
 	.link_update                  = bnx2x_dev_link_update,
 	.stats_get                    = bnx2x_dev_stats_get,
+	.xstats_get                   = bnx2x_dev_xstats_get,
 	.dev_infos_get                = bnx2x_dev_infos_get,
 	.rx_queue_setup               = bnx2x_dev_rx_queue_setup,
 	.rx_queue_release             = bnx2x_dev_rx_queue_release,
@@ -383,6 +458,7 @@ static const struct eth_dev_ops bnx2xvf_eth_dev_ops = {
 	.allmulticast_disable         = bnx2x_dev_allmulticast_disable,
 	.link_update                  = bnx2xvf_dev_link_update,
 	.stats_get                    = bnx2x_dev_stats_get,
+	.xstats_get                   = bnx2x_dev_xstats_get,
 	.dev_infos_get                = bnx2x_dev_infos_get,
 	.rx_queue_setup               = bnx2x_dev_rx_queue_setup,
 	.rx_queue_release             = bnx2x_dev_rx_queue_release,
diff --git a/drivers/net/bnx2x/bnx2x_rxtx.c b/drivers/net/bnx2x/bnx2x_rxtx.c
index 8b047d4..60bd08b 100644
--- a/drivers/net/bnx2x/bnx2x_rxtx.c
+++ b/drivers/net/bnx2x/bnx2x_rxtx.c
@@ -405,6 +405,8 @@ bnx2x_recv_pkts(void *p_rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		new_mb = bnx2x_rxmbuf_alloc(rxq->mb_pool);
 		if (unlikely(!new_mb)) {
 			PMD_RX_LOG(ERR, "mbuf alloc fail fp[%02d]", fp->index);
+			rte_eth_devices[rxq->port_id].data->
+					rx_mbuf_alloc_failed++;
 			goto next_rx;
 		}
 
-- 
1.7.10.3

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [dpdk-dev] [PATCH v4 3/3] bnx2x: update PMD version to 1.0.1.1
  2016-05-04  5:38 [dpdk-dev] [PATCH v4 1/3] bnx2x: refactor Tx routine for single doorbell mechanism Rasesh Mody
  2016-05-04  5:38 ` [dpdk-dev] [PATCH v4 2/3] bnx2x: enhance stats get Rasesh Mody
@ 2016-05-04  5:38 ` Rasesh Mody
  2016-05-06 14:45 ` [dpdk-dev] [PATCH v4 1/3] bnx2x: refactor Tx routine for single doorbell mechanism Bruce Richardson
  2 siblings, 0 replies; 10+ messages in thread
From: Rasesh Mody @ 2016-05-04  5:38 UTC (permalink / raw)
  To: dev; +Cc: Dept-EngDPDKDev, Rasesh Mody, Harish Patil

Signed-off-by: Rasesh Mody <rasesh.mody@qlogic.com>
Signed-off-by: Harish Patil <harish.patil@qlogic.com>
---
 drivers/net/bnx2x/bnx2x.c |    6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/bnx2x/bnx2x.c b/drivers/net/bnx2x/bnx2x.c
index 149fdef..dcd21f8 100644
--- a/drivers/net/bnx2x/bnx2x.c
+++ b/drivers/net/bnx2x/bnx2x.c
@@ -32,18 +32,20 @@
 #define BNX2X_PMD_VER_PREFIX "BNX2X PMD"
 #define BNX2X_PMD_VERSION_MAJOR 1
 #define BNX2X_PMD_VERSION_MINOR 0
-#define BNX2X_PMD_VERSION_PATCH 0
+#define BNX2X_PMD_VERSION_REVISION 1
+#define BNX2X_PMD_VERSION_PATCH 1
 
 static inline const char *
 bnx2x_pmd_version(void)
 {
 	static char version[32];
 
-	snprintf(version, sizeof(version), "%s %s_%d.%d.%d",
+	snprintf(version, sizeof(version), "%s %s_%d.%d.%d.%d",
 			BNX2X_PMD_VER_PREFIX,
 			BNX2X_DRIVER_VERSION,
 			BNX2X_PMD_VERSION_MAJOR,
 			BNX2X_PMD_VERSION_MINOR,
+			BNX2X_PMD_VERSION_REVISION,
 			BNX2X_PMD_VERSION_PATCH);
 
 	return version;
-- 
1.7.10.3

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [dpdk-dev] [PATCH v4 1/3] bnx2x: refactor Tx routine for single doorbell mechanism
  2016-05-04  5:38 [dpdk-dev] [PATCH v4 1/3] bnx2x: refactor Tx routine for single doorbell mechanism Rasesh Mody
  2016-05-04  5:38 ` [dpdk-dev] [PATCH v4 2/3] bnx2x: enhance stats get Rasesh Mody
  2016-05-04  5:38 ` [dpdk-dev] [PATCH v4 3/3] bnx2x: update PMD version to 1.0.1.1 Rasesh Mody
@ 2016-05-06 14:45 ` Bruce Richardson
  2016-05-11  5:41   ` Harish Patil
  2 siblings, 1 reply; 10+ messages in thread
From: Bruce Richardson @ 2016-05-06 14:45 UTC (permalink / raw)
  To: Rasesh Mody; +Cc: dev, Dept-EngDPDKDev, Harish Patil

On Tue, May 03, 2016 at 10:38:20PM -0700, Rasesh Mody wrote:
> Change the Tx routine logic to ring the doorbell once per burst and not
> on every Tx packet. This driver-level optimization is necessary to achieve
> line rates for larger frame sizes (1k or more).
> 
> Fixes: 540a211084a7 ("bnx2x: driver core")
> 
> Signed-off-by: Rasesh Mody <rasesh.mody@qlogic.com>
> Signed-off-by: Harish Patil <harish.patil@qlogic.com>

Hi Rasesh, Harish,

there is quite a bit of churn to the tx_encap routine in this patch, but the
reason for that function change is not really explained well here - why it's
changed from a burst function to a single mbuf function. This is confusing when
the overall objective of the patch seems to be to do the opposite - have things
more burst oriented.

It might be better to have this patch split into two patches - one changing the
tx_encap function and then a second one to restructure the xmit function.

Regards,
/Bruce

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [dpdk-dev] [PATCH v4 2/3] bnx2x: enhance stats get
  2016-05-04  5:38 ` [dpdk-dev] [PATCH v4 2/3] bnx2x: enhance stats get Rasesh Mody
@ 2016-05-06 14:47   ` Bruce Richardson
  2016-05-07  0:14     ` Rasesh Mody
  0 siblings, 1 reply; 10+ messages in thread
From: Bruce Richardson @ 2016-05-06 14:47 UTC (permalink / raw)
  To: Rasesh Mody; +Cc: dev, Dept-EngDPDKDev, Harish Patil

On Tue, May 03, 2016 at 10:38:21PM -0700, Rasesh Mody wrote:
> Enhance the stats_get() routine to display drop counters under
> imissed counter.
> Added extended stats get support to provide additional info.
> Encorporated review comment to rename some of the stats.
> 
> Signed-off-by: Rasesh Mody <rasesh.mody@qlogic.com>
> Signed-off-by: Harish Patil <harish.patil@qlogic.com>

Again this seems to me like it should be two patches rather than one. A first
patch as a fix for the drop counters and then a second patch to add the xstats
functionality.

Regards,
/Bruce

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [dpdk-dev] [PATCH v4 2/3] bnx2x: enhance stats get
  2016-05-06 14:47   ` Bruce Richardson
@ 2016-05-07  0:14     ` Rasesh Mody
  2016-05-10 10:27       ` Remy Horton
  0 siblings, 1 reply; 10+ messages in thread
From: Rasesh Mody @ 2016-05-07  0:14 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, Dept-Eng DPDK Dev, Harish Patil

> From: Bruce Richardson [mailto:bruce.richardson@intel.com]
> Sent: Friday, May 06, 2016 7:47 AM
> 
> On Tue, May 03, 2016 at 10:38:21PM -0700, Rasesh Mody wrote:
> > Enhance the stats_get() routine to display drop counters under imissed
> > counter.
> > Added extended stats get support to provide additional info.
> > Encorporated review comment to rename some of the stats.
> >
> > Signed-off-by: Rasesh Mody <rasesh.mody@qlogic.com>
> > Signed-off-by: Harish Patil <harish.patil@qlogic.com>
> 
> Again this seems to me like it should be two patches rather than one. A first
> patch as a fix for the drop counters and then a second patch to add the xstats
> functionality.
>
> Regards,
> /Bruce
We shall split this patch into an enhancement and a bug fix.
 
Thanks!
Rasesh

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [dpdk-dev] [PATCH v4 2/3] bnx2x: enhance stats get
  2016-05-07  0:14     ` Rasesh Mody
@ 2016-05-10 10:27       ` Remy Horton
  2016-05-11  0:58         ` Rasesh Mody
  0 siblings, 1 reply; 10+ messages in thread
From: Remy Horton @ 2016-05-10 10:27 UTC (permalink / raw)
  To: Rasesh Mody, Bruce Richardson; +Cc: dev, Dept-Eng DPDK Dev, Harish Patil


On 07/05/2016 01:14, Rasesh Mody wrote:
[..]
>>> Enhance the stats_get() routine to display drop counters under imissed
>>> counter.
>>> Added extended stats get support to provide additional info.
>>> Encorporated review comment to rename some of the stats.
[..]
> We shall split this patch into an enhancement and a bug fix.

Keep in mind that the xstats API is changing so that stats_get() no 
longer includes strings:

http://thread.gmane.org/gmane.comp.networking.dpdk.devel/37079
http://thread.gmane.org/gmane.comp.networking.dpdk.devel/37571

..Remy

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [dpdk-dev] [PATCH v4 2/3] bnx2x: enhance stats get
  2016-05-10 10:27       ` Remy Horton
@ 2016-05-11  0:58         ` Rasesh Mody
  2016-06-21  9:00           ` Remy Horton
  0 siblings, 1 reply; 10+ messages in thread
From: Rasesh Mody @ 2016-05-11  0:58 UTC (permalink / raw)
  To: Remy Horton, Bruce Richardson; +Cc: dev, Dept-Eng DPDK Dev, Harish Patil

> From: Remy Horton [mailto:remy.horton@intel.com]
> Sent: Tuesday, May 10, 2016 3:27 AM
> 
> 
> On 07/05/2016 01:14, Rasesh Mody wrote:
> [..]
> >>> Enhance the stats_get() routine to display drop counters under
> >>> imissed counter.
> >>> Added extended stats get support to provide additional info.
> >>> Encorporated review comment to rename some of the stats.
> [..]
> > We shall split this patch into an enhancement and a bug fix.
> 
> Keep in mind that the xstats API is changing so that stats_get() no longer
> includes strings:
> 
> http://thread.gmane.org/gmane.comp.networking.dpdk.devel/37079
> http://thread.gmane.org/gmane.comp.networking.dpdk.devel/37571
> 
> ..Remy

Sure, made a note of it. Do we know when will these changes be picked up? We can incorporate the related changes into our patches if the patches are about to be accepted.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [dpdk-dev] [PATCH v4 1/3] bnx2x: refactor Tx routine for single doorbell mechanism
  2016-05-06 14:45 ` [dpdk-dev] [PATCH v4 1/3] bnx2x: refactor Tx routine for single doorbell mechanism Bruce Richardson
@ 2016-05-11  5:41   ` Harish Patil
  0 siblings, 0 replies; 10+ messages in thread
From: Harish Patil @ 2016-05-11  5:41 UTC (permalink / raw)
  To: Bruce Richardson, Rasesh Mody; +Cc: dev, Dept-Eng DPDK Dev


>On Tue, May 03, 2016 at 10:38:20PM -0700, Rasesh Mody wrote:
>> Change the Tx routine logic to ring the doorbell once per burst and not
>> on every Tx packet. This driver-level optimization is necessary to
>>achieve
>> line rates for larger frame sizes (1k or more).
>> 
>> Fixes: 540a211084a7 ("bnx2x: driver core")
>> 
>> Signed-off-by: Rasesh Mody <rasesh.mody@qlogic.com>
>> Signed-off-by: Harish Patil <harish.patil@qlogic.com>
>
>Hi Rasesh, Harish,
>
>there is quite a bit of churn to the tx_encap routine in this patch, but
>the
>reason for that function change is not really explained well here - why
>it's
>changed from a burst function to a single mbuf function. This is
>confusing when
>the overall objective of the patch seems to be to do the opposite - have
>things
>more burst oriented.
>
>It might be better to have this patch split into two patches - one
>changing the
>tx_encap function and then a second one to restructure the xmit function.
>
>Regards,
>/Bruce
>
>

Hi Bruce,
Sure. We shall have it split into two patches and send it over.

Thanks,
Harish


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [dpdk-dev] [PATCH v4 2/3] bnx2x: enhance stats get
  2016-05-11  0:58         ` Rasesh Mody
@ 2016-06-21  9:00           ` Remy Horton
  0 siblings, 0 replies; 10+ messages in thread
From: Remy Horton @ 2016-06-21  9:00 UTC (permalink / raw)
  To: Rasesh Mody; +Cc: dev, Dept-Eng DPDK Dev, Harish Patil

Morning,

On 11/05/2016 01:58, Rasesh Mody wrote:
[..]
>>> We shall split this patch into an enhancement and a bug fix.
>>
>> Keep in mind that the xstats API is changing so that stats_get() no
>> longer includes strings:
>>
>> http://thread.gmane.org/gmane.comp.networking.dpdk.devel/37079
>> http://thread.gmane.org/gmane.comp.networking.dpdk.devel/37571
>>
>> ..Remy
>
> Sure, made a note of it. Do we know when will these changes be picked
> up? We can incorporate the related changes into our patches if the
> patches are about to be accepted.
>

Quick heads-up - the XStats changes were merged into master a few days ago.

Regards,

..Remy

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2016-06-21  9:00 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-04  5:38 [dpdk-dev] [PATCH v4 1/3] bnx2x: refactor Tx routine for single doorbell mechanism Rasesh Mody
2016-05-04  5:38 ` [dpdk-dev] [PATCH v4 2/3] bnx2x: enhance stats get Rasesh Mody
2016-05-06 14:47   ` Bruce Richardson
2016-05-07  0:14     ` Rasesh Mody
2016-05-10 10:27       ` Remy Horton
2016-05-11  0:58         ` Rasesh Mody
2016-06-21  9:00           ` Remy Horton
2016-05-04  5:38 ` [dpdk-dev] [PATCH v4 3/3] bnx2x: update PMD version to 1.0.1.1 Rasesh Mody
2016-05-06 14:45 ` [dpdk-dev] [PATCH v4 1/3] bnx2x: refactor Tx routine for single doorbell mechanism Bruce Richardson
2016-05-11  5:41   ` Harish Patil

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).