DPDK patches and discussions
 help / color / mirror / Atom feed
From: Ajit Khaparde <ajit.khaparde@broadcom.com>
To: dev@dpdk.org
Cc: ferruh.yigit@intel.com,
	Somnath Kotur <somnath.kotur@broadcom.com>,
	Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
Subject: [dpdk-dev] [PATCH 3/6] net/bnxt: check for some error conditions in Tx path
Date: Wed, 15 May 2019 11:08:14 -0700	[thread overview]
Message-ID: <20190515180817.71523-4-ajit.khaparde@broadcom.com> (raw)
In-Reply-To: <20190515180817.71523-1-ajit.khaparde@broadcom.com>

The HW can have limits on the minimum packet size it can support,
or the maximum number of segments it can support. Check for such
possibilities. Also check if we are going to have a 0 length buffer.

Fixes: 6eb3cc2294fd ("net/bnxt: add initial Tx code")
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
---
 drivers/net/bnxt/bnxt_txr.c | 31 ++++++++++++++++++++++++++++++-
 drivers/net/bnxt/bnxt_txr.h |  2 ++
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/drivers/net/bnxt/bnxt_txr.c b/drivers/net/bnxt/bnxt_txr.c
index 3a0d73af2..9684fb177 100644
--- a/drivers/net/bnxt/bnxt_txr.c
+++ b/drivers/net/bnxt/bnxt_txr.c
@@ -143,6 +143,33 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
 	tx_buf->mbuf = tx_pkt;
 	tx_buf->nr_bds = long_bd + tx_pkt->nb_segs;
 
+	/* Check if number of Tx descriptors is above HW limit */
+	if (unlikely(tx_buf->nr_bds > BNXT_MAX_TSO_SEGS)) {
+		PMD_DRV_LOG(ERR,
+			    "Num descriptors %d exceeds HW limit\n",
+			    tx_buf->nr_bds);
+		return -ENOSPC;
+	}
+
+	/* If packet length is less than minimum packet size, pad it */
+	if (unlikely(rte_pktmbuf_pkt_len(tx_pkt) < BNXT_MIN_PKT_SIZE)) {
+		uint8_t pad = BNXT_MIN_PKT_SIZE - rte_pktmbuf_pkt_len(tx_pkt);
+		char *seg = rte_pktmbuf_append(tx_pkt, pad);
+
+		if (!seg) {
+			PMD_DRV_LOG(ERR,
+				    "Failed to pad mbuf by %d bytes\n",
+				    pad);
+			return -ENOMEM;
+		}
+
+		/* Note: data_len, pkt len are updated in rte_pktmbuf_append */
+		memset(seg, 0, pad);
+	}
+
+	/* Check non zero data_len */
+	RTE_VERIFY(tx_pkt->data_len);
+
 	if (unlikely(bnxt_tx_avail(txr) < tx_buf->nr_bds))
 		return -ENOMEM;
 
@@ -203,6 +230,7 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
 			 */
 			txbd1->hdr_size = hdr_size >> 1;
 			txbd1->mss = tx_pkt->tso_segsz;
+			RTE_VERIFY(txbd1->mss);
 
 		} else if ((tx_pkt->ol_flags & PKT_TX_OIP_IIP_TCP_UDP_CKSUM) ==
 			   PKT_TX_OIP_IIP_TCP_UDP_CKSUM) {
@@ -285,8 +313,9 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
 	}
 
 	m_seg = tx_pkt->next;
-	/* i is set at the end of the if(long_bd) block */
 	while (m_seg) {
+		/* Check non zero data_len */
+		RTE_VERIFY(m_seg->data_len);
 		txr->tx_prod = RING_NEXT(txr->tx_ring_struct, txr->tx_prod);
 		tx_buf = &txr->tx_buf_ring[txr->tx_prod];
 
diff --git a/drivers/net/bnxt/bnxt_txr.h b/drivers/net/bnxt/bnxt_txr.h
index 7f3c7cdb0..f802d5080 100644
--- a/drivers/net/bnxt/bnxt_txr.h
+++ b/drivers/net/bnxt/bnxt_txr.h
@@ -10,6 +10,8 @@
 
 #define MAX_TX_RINGS	16
 #define BNXT_TX_PUSH_THRESH 92
+#define BNXT_MAX_TSO_SEGS	32
+#define BNXT_MIN_PKT_SIZE	52
 
 #define B_TX_DB(db, prod)	rte_write32((DB_KEY_TX | (prod)), db)
 
-- 
2.20.1 (Apple Git-117)

  parent reply	other threads:[~2019-05-15 18:08 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-15 18:08 [dpdk-dev] [PATCH 0/6] bnxt patchset for Tx performance optimization Ajit Khaparde
2019-05-15 18:08 ` Ajit Khaparde
2019-05-15 18:08 ` [dpdk-dev] [PATCH 1/6] net/bnxt: fix an issue seen with TSO Ajit Khaparde
2019-05-15 18:08   ` Ajit Khaparde
2019-05-15 18:08 ` [dpdk-dev] [PATCH 2/6] net/bnxt: add support to update ipid Ajit Khaparde
2019-05-15 18:08   ` Ajit Khaparde
2019-05-15 18:08 ` Ajit Khaparde [this message]
2019-05-15 18:08   ` [dpdk-dev] [PATCH 3/6] net/bnxt: check for some error conditions in Tx path Ajit Khaparde
2019-05-15 18:08 ` [dpdk-dev] [PATCH 4/6] net/bnxt: fix a couple of issues with Tx batching Ajit Khaparde
2019-05-15 18:08   ` Ajit Khaparde
2019-05-15 18:08 ` [dpdk-dev] [PATCH 5/6] net/bnxt: optimize Tx batching code Ajit Khaparde
2019-05-15 18:08   ` Ajit Khaparde
2019-05-15 18:08 ` [dpdk-dev] [PATCH 6/6] net/bnxt: support bulk free of Tx mbufs Ajit Khaparde
2019-05-15 18:08   ` Ajit Khaparde
2019-05-27 16:16 ` [dpdk-dev] [PATCH 0/6] bnxt patchset for Tx performance optimization Ferruh Yigit

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=20190515180817.71523-4-ajit.khaparde@broadcom.com \
    --to=ajit.khaparde@broadcom.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=somnath.kotur@broadcom.com \
    --cc=sriharsha.basavapatna@broadcom.com \
    /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 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).