patches for DPDK stable branches
 help / color / mirror / Atom feed
* [PATCH 19.11 0/8] bnxt fixes backport to 19.11
@ 2022-03-07 15:10 Kalesh A P
  2022-03-07 15:10 ` [PATCH 19.11 1/8] net/bnxt: fix queue stop operation Kalesh A P
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: Kalesh A P @ 2022-03-07 15:10 UTC (permalink / raw)
  To: stable; +Cc: christian.ehrhardt, ajit.khaparde

From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>

Backport of bnxt PMD fixes to 19.11 LTS.

Kalesh AP (8):
  net/bnxt: fix queue stop operation
  net/bnxt: cap maximum number of unicast MAC addresses
  net/bnxt: fix multicast address set
  net/bnxt: restore RSS configuration after reset recovery
  net/bnxt: fix memzone allocation per VNIC
  net/bnxt: fix handling of VF configuration change
  net/bnxt: get maximum supported multicast filters count
  net/bnxt: fix xstats names query overrun

 drivers/net/bnxt/bnxt.h        | 12 +++++-
 drivers/net/bnxt/bnxt_cpr.c    | 18 +++++++++
 drivers/net/bnxt/bnxt_ethdev.c | 84 ++++++++++++++++++++++++++++++++---------
 drivers/net/bnxt/bnxt_hwrm.c   | 29 +++++++++++++-
 drivers/net/bnxt/bnxt_hwrm.h   |  1 +
 drivers/net/bnxt/bnxt_rxq.c    |  5 ++-
 drivers/net/bnxt/bnxt_stats.c  | 61 ++++++++++++++----------------
 drivers/net/bnxt/bnxt_vnic.c   | 85 +++++++++++++++++++-----------------------
 drivers/net/bnxt/bnxt_vnic.h   |  7 +---
 9 files changed, 196 insertions(+), 106 deletions(-)

-- 
2.10.1


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

* [PATCH 19.11 1/8] net/bnxt: fix queue stop operation
  2022-03-07 15:10 [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Kalesh A P
@ 2022-03-07 15:10 ` Kalesh A P
  2022-03-07 15:10 ` [PATCH 19.11 2/8] net/bnxt: cap maximum number of unicast MAC addresses Kalesh A P
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Kalesh A P @ 2022-03-07 15:10 UTC (permalink / raw)
  To: stable; +Cc: christian.ehrhardt, ajit.khaparde

From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>

[ upstream commit 3e6fae2b65aa778dba5059ec0bc92102f05adc54 ]

When there are no active Rx queues(i.e when all queues have been
stopped), clear the RSS redirection table of the VNIC on Thor.

Fixes: 9b63c6fd70e3 ("net/bnxt: support Rx/Tx queue start/stop")

Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Lance Richardson <lance.richardson@broadcom.com>
---
 drivers/net/bnxt/bnxt_hwrm.c | 23 +++++++++++++++++++++++
 drivers/net/bnxt/bnxt_hwrm.h |  1 +
 drivers/net/bnxt/bnxt_rxq.c  |  3 +++
 3 files changed, 27 insertions(+)

diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c
index 25e6b8c..6ab8ca7 100644
--- a/drivers/net/bnxt/bnxt_hwrm.c
+++ b/drivers/net/bnxt/bnxt_hwrm.c
@@ -5258,3 +5258,26 @@ int bnxt_hwrm_port_phy_qcaps(struct bnxt *bp)
 
 	return 0;
 }
+
+int
+bnxt_vnic_rss_clear_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic)
+{
+	struct hwrm_vnic_rss_cfg_output *resp = bp->hwrm_cmd_resp_addr;
+	struct hwrm_vnic_rss_cfg_input req = {0};
+	int nr_ctxs = vnic->num_lb_ctxts;
+	int i, rc = 0;
+
+	for (i = 0; i < nr_ctxs; i++) {
+		HWRM_PREP(req, VNIC_RSS_CFG, BNXT_USE_CHIMP_MB);
+
+		req.rss_ctx_idx = rte_cpu_to_le_16(vnic->fw_grp_ids[i]);
+		req.vnic_id = rte_cpu_to_le_16(vnic->fw_vnic_id);
+
+		rc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB);
+
+		HWRM_CHECK_RESULT();
+		HWRM_UNLOCK();
+	}
+
+	return rc;
+}
diff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h
index 815e61d..bb1762d 100644
--- a/drivers/net/bnxt/bnxt_hwrm.h
+++ b/drivers/net/bnxt/bnxt_hwrm.h
@@ -229,4 +229,5 @@ int bnxt_hwrm_port_phy_qcaps(struct bnxt *bp);
 int bnxt_hwrm_rx_ring_reset(struct bnxt *bp, int queue_index);
 int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
 			 struct bnxt_ring_stats *stats, bool rx);
+int bnxt_vnic_rss_clear_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic);
 #endif
diff --git a/drivers/net/bnxt/bnxt_rxq.c b/drivers/net/bnxt/bnxt_rxq.c
index 5fd83c0..b0ab3df 100644
--- a/drivers/net/bnxt/bnxt_rxq.c
+++ b/drivers/net/bnxt/bnxt_rxq.c
@@ -538,6 +538,9 @@ int bnxt_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 		if (active_queue_cnt == 0) {
 			uint16_t saved_mru = vnic->mru;
 
+			/* clear RSS setting on vnic. */
+			bnxt_vnic_rss_clear_p5(bp, vnic);
+
 			vnic->mru = 0;
 			/* Reconfigure default receive ring and MRU. */
 			bnxt_hwrm_vnic_cfg(bp, vnic);
-- 
2.10.1


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

* [PATCH 19.11 2/8] net/bnxt: cap maximum number of unicast MAC addresses
  2022-03-07 15:10 [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Kalesh A P
  2022-03-07 15:10 ` [PATCH 19.11 1/8] net/bnxt: fix queue stop operation Kalesh A P
@ 2022-03-07 15:10 ` Kalesh A P
  2022-03-07 15:10 ` [PATCH 19.11 3/8] net/bnxt: fix multicast address set Kalesh A P
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Kalesh A P @ 2022-03-07 15:10 UTC (permalink / raw)
  To: stable; +Cc: christian.ehrhardt, ajit.khaparde

From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>

[ upstream commit 604a6be6b6c70cafdf055129d7d141d84509ad90 ]

The Maximum number of receive mac addr is hard coded to 128
in the ethdev library(RTE_ETH_NUM_RECEIVE_MAC_ADDR).
But the bnxt devices support more than 128 unicast MAC filters
which could result in a segfault while user tries to add more
than 128 unicast MAC addresses to the port.

Fixes: a2033fda22ab ("net/bnxt: fix number of MAC addresses for VMDq")

Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
---
 drivers/net/bnxt/bnxt_ethdev.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index d4c63fa..4a1c1d7 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -559,7 +559,7 @@ static int bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
 		return rc;
 
 	/* MAC Specifics */
-	dev_info->max_mac_addrs = bp->max_l2_ctx;
+	dev_info->max_mac_addrs = RTE_MIN(bp->max_l2_ctx, ETH_NUM_RECEIVE_MAC_ADDR);
 	dev_info->max_hash_mac_addrs = 0;
 
 	/* PF/VF specifics */
@@ -4927,11 +4927,15 @@ static int bnxt_alloc_stats_mem(struct bnxt *bp)
 static int bnxt_setup_mac_addr(struct rte_eth_dev *eth_dev)
 {
 	struct bnxt *bp = eth_dev->data->dev_private;
+	size_t max_mac_addr = RTE_MIN(bp->max_l2_ctx, ETH_NUM_RECEIVE_MAC_ADDR);
 	int rc = 0;
 
+	if (bp->max_l2_ctx > ETH_NUM_RECEIVE_MAC_ADDR)
+		PMD_DRV_LOG(INFO, "Max number of MAC addrs supported is %d, but will be limited to %d\n",
+			    bp->max_l2_ctx, ETH_NUM_RECEIVE_MAC_ADDR);
+
 	eth_dev->data->mac_addrs = rte_zmalloc("bnxt_mac_addr_tbl",
-					       RTE_ETHER_ADDR_LEN *
-					       bp->max_l2_ctx,
+					       RTE_ETHER_ADDR_LEN * max_mac_addr,
 					       0);
 	if (eth_dev->data->mac_addrs == NULL) {
 		PMD_DRV_LOG(ERR, "Failed to alloc MAC addr tbl\n");
-- 
2.10.1


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

* [PATCH 19.11 3/8] net/bnxt: fix multicast address set
  2022-03-07 15:10 [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Kalesh A P
  2022-03-07 15:10 ` [PATCH 19.11 1/8] net/bnxt: fix queue stop operation Kalesh A P
  2022-03-07 15:10 ` [PATCH 19.11 2/8] net/bnxt: cap maximum number of unicast MAC addresses Kalesh A P
@ 2022-03-07 15:10 ` Kalesh A P
  2022-03-07 15:10 ` [PATCH 19.11 4/8] net/bnxt: restore RSS configuration after reset recovery Kalesh A P
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Kalesh A P @ 2022-03-07 15:10 UTC (permalink / raw)
  To: stable; +Cc: christian.ehrhardt, ajit.khaparde

From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>

[ upstream commit 4dc9409e01b41a8cd8d53bcc38344666fd42a7c9 ]

Fix bnxt_dev_set_mc_addr_list_op.
Fix to cache the multicast mac addresses added to the port
to the driver private structure memory. Use this cached mc list
to program the FW.

This fixes an issue where multicast packets reception is
successful only if the multicast mac address of the packets
is the first one in the multicast address list of the port.

This is in preparation for another fix in the series.

Fixes: d69851df12b2 ("net/bnxt: support multicast filter and set MAC addr")

Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
---
 drivers/net/bnxt/bnxt.h        |  5 +++++
 drivers/net/bnxt/bnxt_ethdev.c | 34 +++++++++++++++++++++++++---------
 drivers/net/bnxt/bnxt_hwrm.c   |  4 ++--
 drivers/net/bnxt/bnxt_vnic.c   |  7 +------
 drivers/net/bnxt/bnxt_vnic.h   |  4 ----
 5 files changed, 33 insertions(+), 21 deletions(-)

diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index 73001b1..31cc60a 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -710,6 +710,11 @@ struct bnxt {
 	struct bnxt_error_recovery_info *recovery_info;
 	struct bnxt_ring_stats	*prev_rx_ring_stats;
 	struct bnxt_ring_stats	*prev_tx_ring_stats;
+
+#define BNXT_MAX_MC_ADDRS	16
+	struct rte_ether_addr	*mcast_addr_list;
+	rte_iova_t		mc_list_dma_addr;
+	uint32_t		nb_mc_addr;
 };
 
 static
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 4a1c1d7..6bd072e 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -2281,9 +2281,8 @@ bnxt_dev_set_mc_addr_list_op(struct rte_eth_dev *eth_dev,
 			  uint32_t nb_mc_addr)
 {
 	struct bnxt *bp = eth_dev->data->dev_private;
-	char *mc_addr_list = (char *)mc_addr_set;
 	struct bnxt_vnic_info *vnic;
-	uint32_t off = 0, i = 0;
+	uint32_t i = 0;
 	int rc;
 
 	rc = is_bnxt_in_error(bp);
@@ -2292,6 +2291,8 @@ bnxt_dev_set_mc_addr_list_op(struct rte_eth_dev *eth_dev,
 
 	vnic = BNXT_GET_DEFAULT_VNIC(bp);
 
+	bp->nb_mc_addr = nb_mc_addr;
+
 	if (nb_mc_addr > BNXT_MAX_MC_ADDRS) {
 		vnic->flags |= BNXT_VNIC_INFO_ALLMULTI;
 		goto allmulti;
@@ -2299,14 +2300,10 @@ bnxt_dev_set_mc_addr_list_op(struct rte_eth_dev *eth_dev,
 
 	/* TODO Check for Duplicate mcast addresses */
 	vnic->flags &= ~BNXT_VNIC_INFO_ALLMULTI;
-	for (i = 0; i < nb_mc_addr; i++) {
-		memcpy(vnic->mc_list + off, &mc_addr_list[i],
-			RTE_ETHER_ADDR_LEN);
-		off += RTE_ETHER_ADDR_LEN;
-	}
+	for (i = 0; i < nb_mc_addr; i++)
+		rte_ether_addr_copy(&mc_addr_set[i], &bp->mcast_addr_list[i]);
 
-	vnic->mc_addr_cnt = i;
-	if (vnic->mc_addr_cnt)
+	if (bp->nb_mc_addr)
 		vnic->flags |= BNXT_VNIC_INFO_MCAST;
 	else
 		vnic->flags &= ~BNXT_VNIC_INFO_MCAST;
@@ -4962,6 +4959,23 @@ static int bnxt_setup_mac_addr(struct rte_eth_dev *eth_dev)
 	/* Copy the permanent MAC from the FUNC_QCAPS response */
 	memcpy(&eth_dev->data->mac_addrs[0], bp->mac_addr, RTE_ETHER_ADDR_LEN);
 
+	/*
+	 *  Allocate memory to hold multicast mac addresses added.
+	 *  Used to restore them during reset recovery
+	 */
+	bp->mcast_addr_list = rte_zmalloc("bnxt_mcast_addr_tbl",
+					  sizeof(struct rte_ether_addr) *
+					  BNXT_MAX_MC_ADDRS, 0);
+	if (bp->mcast_addr_list == NULL) {
+		PMD_DRV_LOG(ERR, "Failed to allocate multicast addr table\n");
+		return -ENOMEM;
+	}
+	bp->mc_list_dma_addr = rte_malloc_virt2iova(bp->mcast_addr_list);
+	if (bp->mc_list_dma_addr == RTE_BAD_IOVA) {
+		PMD_DRV_LOG(ERR, "Fail to map mcast_addr_list to physical memory\n");
+		return -ENOMEM;
+	}
+
 	return rc;
 }
 
@@ -5249,6 +5263,8 @@ bnxt_uninit_resources(struct bnxt *bp, bool reconfig_dev)
 			rte_free(bp->recovery_info);
 			bp->recovery_info = NULL;
 		}
+		rte_free(bp->mcast_addr_list);
+		bp->mcast_addr_list = NULL;
 	}
 
 	bnxt_uninit_locks(bp);
diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c
index 6ab8ca7..472bb7c 100644
--- a/drivers/net/bnxt/bnxt_hwrm.c
+++ b/drivers/net/bnxt/bnxt_hwrm.c
@@ -308,8 +308,8 @@ int bnxt_hwrm_cfa_l2_set_rx_mask(struct bnxt *bp,
 		mask |= HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_ALL_MCAST;
 	} else if (vnic->flags & BNXT_VNIC_INFO_MCAST) {
 		mask |= HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_MCAST;
-		req.num_mc_entries = rte_cpu_to_le_32(vnic->mc_addr_cnt);
-		req.mc_tbl_addr = rte_cpu_to_le_64(vnic->mc_list_dma_addr);
+		req.num_mc_entries = rte_cpu_to_le_32(bp->nb_mc_addr);
+		req.mc_tbl_addr = rte_cpu_to_le_64(bp->mc_list_dma_addr);
 	}
 	if (vlan_table) {
 		if (!(mask & HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_VLAN_NONVLAN))
diff --git a/drivers/net/bnxt/bnxt_vnic.c b/drivers/net/bnxt/bnxt_vnic.c
index 19a4372..8a35f7f 100644
--- a/drivers/net/bnxt/bnxt_vnic.c
+++ b/drivers/net/bnxt/bnxt_vnic.c
@@ -126,8 +126,7 @@ int bnxt_alloc_vnic_attributes(struct bnxt *bp)
 	int i;
 	rte_iova_t mz_phys_addr;
 
-	entry_length = HW_HASH_KEY_SIZE +
-		       BNXT_MAX_MC_ADDRS * RTE_ETHER_ADDR_LEN;
+	entry_length = HW_HASH_KEY_SIZE;
 
 	if (BNXT_CHIP_THOR(bp))
 		rss_table_size = BNXT_RSS_TBL_SIZE_THOR *
@@ -169,10 +168,6 @@ int bnxt_alloc_vnic_attributes(struct bnxt *bp)
 
 		vnic->rss_hash_key_dma_addr = vnic->rss_table_dma_addr +
 					      rss_table_size;
-		vnic->mc_list = (void *)((char *)vnic->rss_hash_key +
-				HW_HASH_KEY_SIZE);
-		vnic->mc_list_dma_addr = vnic->rss_hash_key_dma_addr +
-				HW_HASH_KEY_SIZE;
 		bnxt_prandom_bytes(vnic->rss_hash_key, HW_HASH_KEY_SIZE);
 	}
 
diff --git a/drivers/net/bnxt/bnxt_vnic.h b/drivers/net/bnxt/bnxt_vnic.h
index f447710..80df2c5 100644
--- a/drivers/net/bnxt/bnxt_vnic.h
+++ b/drivers/net/bnxt/bnxt_vnic.h
@@ -29,10 +29,6 @@ struct bnxt_vnic_info {
 	uint16_t	*rss_table;
 	rte_iova_t	rss_hash_key_dma_addr;
 	void		*rss_hash_key;
-	rte_iova_t	mc_list_dma_addr;
-	char		*mc_list;
-	uint32_t	mc_addr_cnt;
-#define BNXT_MAX_MC_ADDRS		16
 	uint32_t	flags;
 #define BNXT_VNIC_INFO_PROMISC			(1 << 0)
 #define BNXT_VNIC_INFO_ALLMULTI			(1 << 1)
-- 
2.10.1


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

* [PATCH 19.11 4/8] net/bnxt: restore RSS configuration after reset recovery
  2022-03-07 15:10 [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Kalesh A P
                   ` (2 preceding siblings ...)
  2022-03-07 15:10 ` [PATCH 19.11 3/8] net/bnxt: fix multicast address set Kalesh A P
@ 2022-03-07 15:10 ` Kalesh A P
  2022-03-07 15:10 ` [PATCH 19.11 5/8] net/bnxt: fix memzone allocation per VNIC Kalesh A P
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Kalesh A P @ 2022-03-07 15:10 UTC (permalink / raw)
  To: stable; +Cc: christian.ehrhardt, ajit.khaparde

From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>

[ upstream commit 9b4353bec3d17d241e511f7d6917417fd395c462 ]

During reset recovery, driver is not restoring the VNIC rss hash key.
It's generating a new random hash key which results in unexpected
RSS behavior after recovery. Fixed this by storing the VNIC RSS
configuration to a local struct and then applying the cached value
during the recovery.

Fixes: df6cd7c1f73a ("net/bnxt: handle reset notify async event from FW")

Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
---
 drivers/net/bnxt/bnxt.h        |  2 ++
 drivers/net/bnxt/bnxt_ethdev.c | 35 +++++++++++++++++++++++++++++++----
 drivers/net/bnxt/bnxt_rxq.c    |  2 +-
 drivers/net/bnxt/bnxt_vnic.c   |  9 +++++++--
 drivers/net/bnxt/bnxt_vnic.h   |  2 +-
 5 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index 31cc60a..bd83005 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -715,6 +715,8 @@ struct bnxt {
 	struct rte_ether_addr	*mcast_addr_list;
 	rte_iova_t		mc_list_dma_addr;
 	uint32_t		nb_mc_addr;
+
+	struct rte_eth_rss_conf	rss_conf; /* RSS configuration. */
 };
 
 static
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 6bd072e..f52ef2b 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -209,7 +209,7 @@ static int bnxt_alloc_mem(struct bnxt *bp, bool reconfig)
 	if (rc)
 		goto alloc_mem_err;
 
-	rc = bnxt_alloc_vnic_attributes(bp);
+	rc = bnxt_alloc_vnic_attributes(bp, reconfig);
 	if (rc)
 		goto alloc_mem_err;
 
@@ -657,6 +657,7 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
 {
 	struct bnxt *bp = eth_dev->data->dev_private;
 	uint64_t rx_offloads = eth_dev->data->dev_conf.rxmode.offloads;
+	struct rte_eth_rss_conf *rss_conf = &eth_dev->data->dev_conf.rx_adv_conf.rss_conf;
 	int rc;
 
 	bp->rx_queues = (void *)eth_dev->data->rx_queues;
@@ -738,6 +739,17 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
 		rx_offloads |= DEV_RX_OFFLOAD_RSS_HASH;
 	eth_dev->data->dev_conf.rxmode.offloads = rx_offloads;
 
+	/* application provides the hash key to program */
+	if (rss_conf->rss_key != NULL) {
+		if (rss_conf->rss_key_len != HW_HASH_KEY_SIZE)
+			PMD_DRV_LOG(WARNING, "port %u RSS key len must be %d bytes long",
+				    eth_dev->data->port_id, HW_HASH_KEY_SIZE);
+		else
+			memcpy(bp->rss_conf.rss_key, rss_conf->rss_key, HW_HASH_KEY_SIZE);
+	}
+	bp->rss_conf.rss_key_len = HW_HASH_KEY_SIZE;
+	bp->rss_conf.rss_hf = rss_conf->rss_hf;
+
 	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
 		eth_dev->data->mtu =
 			eth_dev->data->dev_conf.rxmode.max_rx_pkt_len -
@@ -1575,14 +1587,14 @@ static int bnxt_rss_hash_update_op(struct rte_eth_dev *eth_dev,
 	}
 
 	bp->flags |= BNXT_FLAG_UPDATE_HASH;
-	memcpy(&eth_dev->data->dev_conf.rx_adv_conf.rss_conf,
-	       rss_conf,
-	       sizeof(*rss_conf));
 
 	/* Update the default RSS VNIC(s) */
 	vnic = &bp->vnic_info[0];
 	vnic->hash_type = bnxt_rte_to_hwrm_hash_types(rss_conf->rss_hf);
 
+	/* Cache the hash function */
+	bp->rss_conf.rss_hf = rss_conf->rss_hf;
+
 	/*
 	 * If hashkey is not specified, use the previously configured
 	 * hashkey
@@ -1598,6 +1610,9 @@ static int bnxt_rss_hash_update_op(struct rte_eth_dev *eth_dev,
 	}
 	memcpy(vnic->rss_hash_key, rss_conf->rss_key, rss_conf->rss_key_len);
 
+	/* Cache the hash key */
+	memcpy(bp->rss_conf.rss_key, rss_conf->rss_key, HW_HASH_KEY_SIZE);
+
 rss_config:
 	rc = bnxt_hwrm_vnic_rss_cfg(bp, vnic);
 	return rc;
@@ -5146,6 +5161,16 @@ static int bnxt_init_resources(struct bnxt *bp, bool reconfig_dev)
 		}
 	}
 
+	if (!reconfig_dev) {
+		bp->rss_conf.rss_key = rte_zmalloc("bnxt_rss_key",
+						   HW_HASH_KEY_SIZE, 0);
+		if (bp->rss_conf.rss_key == NULL) {
+			PMD_DRV_LOG(ERR, "port %u cannot allocate RSS hash key memory",
+				    bp->eth_dev->data->port_id);
+			return -ENOMEM;
+		}
+	}
+
 	rc = bnxt_alloc_mem(bp, reconfig_dev);
 	if (rc)
 		return rc;
@@ -5265,6 +5290,8 @@ bnxt_uninit_resources(struct bnxt *bp, bool reconfig_dev)
 		}
 		rte_free(bp->mcast_addr_list);
 		bp->mcast_addr_list = NULL;
+		rte_free(bp->rss_conf.rss_key);
+		bp->rss_conf.rss_key = NULL;
 	}
 
 	bnxt_uninit_locks(bp);
diff --git a/drivers/net/bnxt/bnxt_rxq.c b/drivers/net/bnxt/bnxt_rxq.c
index b0ab3df..993219a 100644
--- a/drivers/net/bnxt/bnxt_rxq.c
+++ b/drivers/net/bnxt/bnxt_rxq.c
@@ -137,7 +137,7 @@ int bnxt_mq_rx_configure(struct bnxt *bp)
 	bp->rx_num_qs_per_vnic = nb_q_per_grp;
 
 	if (dev_conf->rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG) {
-		struct rte_eth_rss_conf *rss = &dev_conf->rx_adv_conf.rss_conf;
+		struct rte_eth_rss_conf *rss = &bp->rss_conf;
 
 		if (bp->flags & BNXT_FLAG_UPDATE_HASH)
 			bp->flags &= ~BNXT_FLAG_UPDATE_HASH;
diff --git a/drivers/net/bnxt/bnxt_vnic.c b/drivers/net/bnxt/bnxt_vnic.c
index 8a35f7f..9bcf385 100644
--- a/drivers/net/bnxt/bnxt_vnic.c
+++ b/drivers/net/bnxt/bnxt_vnic.c
@@ -114,7 +114,7 @@ void bnxt_free_vnic_attributes(struct bnxt *bp)
 	}
 }
 
-int bnxt_alloc_vnic_attributes(struct bnxt *bp)
+int bnxt_alloc_vnic_attributes(struct bnxt *bp, bool reconfig)
 {
 	struct bnxt_vnic_info *vnic;
 	struct rte_pci_device *pdev = bp->pdev;
@@ -168,7 +168,12 @@ int bnxt_alloc_vnic_attributes(struct bnxt *bp)
 
 		vnic->rss_hash_key_dma_addr = vnic->rss_table_dma_addr +
 					      rss_table_size;
-		bnxt_prandom_bytes(vnic->rss_hash_key, HW_HASH_KEY_SIZE);
+		if (!reconfig) {
+			bnxt_prandom_bytes(vnic->rss_hash_key, HW_HASH_KEY_SIZE);
+			memcpy(bp->rss_conf.rss_key, vnic->rss_hash_key, HW_HASH_KEY_SIZE);
+		} else {
+			memcpy(vnic->rss_hash_key, bp->rss_conf.rss_key, HW_HASH_KEY_SIZE);
+		}
 	}
 
 	return 0;
diff --git a/drivers/net/bnxt/bnxt_vnic.h b/drivers/net/bnxt/bnxt_vnic.h
index 80df2c5..a9818b1 100644
--- a/drivers/net/bnxt/bnxt_vnic.h
+++ b/drivers/net/bnxt/bnxt_vnic.h
@@ -57,7 +57,7 @@ int bnxt_free_vnic(struct bnxt *bp, struct bnxt_vnic_info *vnic,
 struct bnxt_vnic_info *bnxt_alloc_vnic(struct bnxt *bp);
 void bnxt_free_all_vnics(struct bnxt *bp);
 void bnxt_free_vnic_attributes(struct bnxt *bp);
-int bnxt_alloc_vnic_attributes(struct bnxt *bp);
+int bnxt_alloc_vnic_attributes(struct bnxt *bp, bool reconfig);
 void bnxt_free_vnic_mem(struct bnxt *bp);
 int bnxt_alloc_vnic_mem(struct bnxt *bp);
 int bnxt_vnic_grp_alloc(struct bnxt *bp, struct bnxt_vnic_info *vnic);
-- 
2.10.1


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

* [PATCH 19.11 5/8] net/bnxt: fix memzone allocation per VNIC
  2022-03-07 15:10 [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Kalesh A P
                   ` (3 preceding siblings ...)
  2022-03-07 15:10 ` [PATCH 19.11 4/8] net/bnxt: restore RSS configuration after reset recovery Kalesh A P
@ 2022-03-07 15:10 ` Kalesh A P
  2022-03-07 15:10 ` [PATCH 19.11 6/8] net/bnxt: fix handling of VF configuration change Kalesh A P
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Kalesh A P @ 2022-03-07 15:10 UTC (permalink / raw)
  To: stable; +Cc: christian.ehrhardt, ajit.khaparde

From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>

[ upstream commit 5b8b248c9679b9571f73a75e1905d7cef39e6c6e ]

In case of Thor RSS table size is too big. This could result in
memory allocation failure when the supported vnic count is high.
Instead of allocating the memzone for all VNICs in one shot,
allocate for each VNIC individually.

Also, fixed to free the memzone in the uninit path.

Fixes: 9738793f28ec ("net/bnxt: add VNIC functions and structs")

Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
---
 drivers/net/bnxt/bnxt_vnic.c | 67 +++++++++++++++++++-------------------------
 drivers/net/bnxt/bnxt_vnic.h |  1 +
 2 files changed, 30 insertions(+), 38 deletions(-)

diff --git a/drivers/net/bnxt/bnxt_vnic.c b/drivers/net/bnxt/bnxt_vnic.c
index 9bcf385..d64c413 100644
--- a/drivers/net/bnxt/bnxt_vnic.c
+++ b/drivers/net/bnxt/bnxt_vnic.c
@@ -98,18 +98,11 @@ void bnxt_free_vnic_attributes(struct bnxt *bp)
 
 	for (i = 0; i < bp->max_vnics; i++) {
 		vnic = &bp->vnic_info[i];
-		if (vnic->rss_table) {
-			/* 'Unreserve' the rss_table */
-			/* N/A */
-
-			vnic->rss_table = NULL;
-		}
-
-		if (vnic->rss_hash_key) {
-			/* 'Unreserve' the rss_hash_key */
-			/* N/A */
-
+		if (vnic->rss_mz != NULL) {
+			rte_memzone_free(vnic->rss_mz);
+			vnic->rss_mz = NULL;
 			vnic->rss_hash_key = NULL;
+			vnic->rss_table = NULL;
 		}
 	}
 }
@@ -122,7 +115,6 @@ int bnxt_alloc_vnic_attributes(struct bnxt *bp, bool reconfig)
 	char mz_name[RTE_MEMZONE_NAMESIZE];
 	uint32_t entry_length;
 	size_t rss_table_size;
-	uint16_t max_vnics;
 	int i;
 	rte_iova_t mz_phys_addr;
 
@@ -136,38 +128,37 @@ int bnxt_alloc_vnic_attributes(struct bnxt *bp, bool reconfig)
 
 	entry_length = RTE_CACHE_LINE_ROUNDUP(entry_length + rss_table_size);
 
-	max_vnics = bp->max_vnics;
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE,
-		 "bnxt_%04x:%02x:%02x:%02x_vnicattr", pdev->addr.domain,
-		 pdev->addr.bus, pdev->addr.devid, pdev->addr.function);
-	mz_name[RTE_MEMZONE_NAMESIZE - 1] = 0;
-	mz = rte_memzone_lookup(mz_name);
-	if (!mz) {
-		mz = rte_memzone_reserve(mz_name,
-				entry_length * max_vnics,
-				bp->eth_dev->device->numa_node,
-				RTE_MEMZONE_2MB |
-				RTE_MEMZONE_SIZE_HINT_ONLY |
-				RTE_MEMZONE_IOVA_CONTIG);
-		if (!mz)
-			return -ENOMEM;
-	}
-	mz_phys_addr = mz->iova;
-
-	for (i = 0; i < max_vnics; i++) {
+	for (i = 0; i < bp->max_vnics; i++) {
 		vnic = &bp->vnic_info[i];
 
+		snprintf(mz_name, RTE_MEMZONE_NAMESIZE,
+			 "bnxt_%04x:%02x:%02x:%02x_vnicattr_%d", pdev->addr.domain,
+			 pdev->addr.bus, pdev->addr.devid, pdev->addr.function, i);
+		mz_name[RTE_MEMZONE_NAMESIZE - 1] = 0;
+		mz = rte_memzone_lookup(mz_name);
+		if (mz == NULL) {
+			mz = rte_memzone_reserve(mz_name,
+						 entry_length,
+						 bp->eth_dev->device->numa_node,
+						 RTE_MEMZONE_2MB |
+						 RTE_MEMZONE_SIZE_HINT_ONLY |
+						 RTE_MEMZONE_IOVA_CONTIG);
+			if (mz == NULL) {
+				PMD_DRV_LOG(ERR, "Cannot allocate bnxt vnic_attributes memory\n");
+				return -ENOMEM;
+			}
+		}
+		vnic->rss_mz = mz;
+		mz_phys_addr = mz->iova;
+
 		/* Allocate rss table and hash key */
-		vnic->rss_table =
-			(void *)((char *)mz->addr + (entry_length * i));
+		vnic->rss_table = (void *)((char *)mz->addr);
+		vnic->rss_table_dma_addr = mz_phys_addr;
 		memset(vnic->rss_table, -1, entry_length);
 
-		vnic->rss_table_dma_addr = mz_phys_addr + (entry_length * i);
-		vnic->rss_hash_key = (void *)((char *)vnic->rss_table +
-					      rss_table_size);
+		vnic->rss_hash_key = (void *)((char *)vnic->rss_table + rss_table_size);
+		vnic->rss_hash_key_dma_addr = vnic->rss_table_dma_addr + rss_table_size;
 
-		vnic->rss_hash_key_dma_addr = vnic->rss_table_dma_addr +
-					      rss_table_size;
 		if (!reconfig) {
 			bnxt_prandom_bytes(vnic->rss_hash_key, HW_HASH_KEY_SIZE);
 			memcpy(bp->rss_conf.rss_key, vnic->rss_hash_key, HW_HASH_KEY_SIZE);
diff --git a/drivers/net/bnxt/bnxt_vnic.h b/drivers/net/bnxt/bnxt_vnic.h
index a9818b1..6fb5ec2 100644
--- a/drivers/net/bnxt/bnxt_vnic.h
+++ b/drivers/net/bnxt/bnxt_vnic.h
@@ -25,6 +25,7 @@ struct bnxt_vnic_info {
 	uint16_t	mru;
 	uint16_t	hash_type;
 	uint8_t		hash_mode;
+	const struct rte_memzone *rss_mz;
 	rte_iova_t	rss_table_dma_addr;
 	uint16_t	*rss_table;
 	rte_iova_t	rss_hash_key_dma_addr;
-- 
2.10.1


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

* [PATCH 19.11 6/8] net/bnxt: fix handling of VF configuration change
  2022-03-07 15:10 [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Kalesh A P
                   ` (4 preceding siblings ...)
  2022-03-07 15:10 ` [PATCH 19.11 5/8] net/bnxt: fix memzone allocation per VNIC Kalesh A P
@ 2022-03-07 15:10 ` Kalesh A P
  2022-03-07 15:10 ` [PATCH 19.11 7/8] net/bnxt: get maximum supported multicast filters count Kalesh A P
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Kalesh A P @ 2022-03-07 15:10 UTC (permalink / raw)
  To: stable; +Cc: christian.ehrhardt, ajit.khaparde

From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>

[ upstream commit 6c63f3495e3563869461ec523d13cbb7fcf67d82 ]

When there is a change in the default VLAN of the VF,
FW sends the VF_CFG_CHANGE async event to the driver.
Upon receiving this async event, driver currently only queries
the FW using HWRM_FUNC_QCFG. But this is not enough.

Driver has to clean up the existing filter and recreate filters
so the FW can apply the default VLAN to the filter.

Fixes: 12213821a8a3 ("net/bnxt: register for more async events")

Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>

Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
---
 drivers/net/bnxt/bnxt.h        |  4 +++-
 drivers/net/bnxt/bnxt_cpr.c    | 18 ++++++++++++++++++
 drivers/net/bnxt/bnxt_ethdev.c |  5 +++--
 3 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index bd83005..c850945 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -772,7 +772,9 @@ uint16_t bnxt_dummy_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 			      uint16_t nb_pkts);
 uint16_t bnxt_dummy_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
 			      uint16_t nb_pkts);
-
+int bnxt_dev_start_op(struct rte_eth_dev *eth_dev);
+void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev);
+void bnxt_handle_vf_cfg_change(void *arg);
 extern const struct rte_flow_ops bnxt_flow_ops;
 #define bnxt_acquire_flow_lock(bp) \
 	pthread_mutex_lock(&(bp)->flow_lock)
diff --git a/drivers/net/bnxt/bnxt_cpr.c b/drivers/net/bnxt/bnxt_cpr.c
index f02cbbb..d59f87a 100644
--- a/drivers/net/bnxt/bnxt_cpr.c
+++ b/drivers/net/bnxt/bnxt_cpr.c
@@ -46,6 +46,22 @@ void bnxt_wait_for_device_shutdown(struct bnxt *bp)
 	} while (timeout);
 }
 
+void bnxt_handle_vf_cfg_change(void *arg)
+{
+	struct bnxt *bp = arg;
+	struct rte_eth_dev *eth_dev = bp->eth_dev;
+	int rc;
+
+	/* Free and recreate filters with default VLAN */
+	if (eth_dev->data->dev_started) {
+		bnxt_dev_stop_op(eth_dev);
+
+		rc = bnxt_dev_start_op(eth_dev);
+		if (rc != 0)
+			PMD_DRV_LOG(ERR, "Failed to start Port:%u\n", eth_dev->data->port_id);
+	}
+}
+
 /*
  * Async event handling
  */
@@ -73,6 +89,8 @@ void bnxt_handle_async_event(struct bnxt *bp,
 	case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_VF_CFG_CHANGE:
 		PMD_DRV_LOG(INFO, "Async event: VF config changed\n");
 		bnxt_hwrm_func_qcfg(bp, NULL);
+		if (BNXT_VF(bp))
+			rte_eal_alarm_set(1, bnxt_handle_vf_cfg_change, (void *)bp);
 		break;
 	case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED:
 		PMD_DRV_LOG(INFO, "Port conn async event\n");
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index f52ef2b..5994a33 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -895,7 +895,7 @@ static int bnxt_handle_if_change_status(struct bnxt *bp)
 	return rc;
 }
 
-static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
+int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
 {
 	struct bnxt *bp = eth_dev->data->dev_private;
 	uint64_t rx_offloads = eth_dev->data->dev_conf.rxmode.offloads;
@@ -1069,7 +1069,7 @@ static int bnxt_ptp_start(struct bnxt *bp)
 }
 
 /* Unload the driver, release resources */
-static void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev)
+void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev)
 {
 	struct bnxt *bp = eth_dev->data->dev_private;
 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
@@ -1130,6 +1130,7 @@ static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
 	/* cancel the recovery handler before remove dev */
 	rte_eal_alarm_cancel(bnxt_dev_reset_and_resume, (void *)bp);
 	rte_eal_alarm_cancel(bnxt_dev_recover, (void *)bp);
+	rte_eal_alarm_cancel(bnxt_handle_vf_cfg_change, (void *)bp);
 
 	if (eth_dev->data->dev_started)
 		bnxt_dev_stop_op(eth_dev);
-- 
2.10.1


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

* [PATCH 19.11 7/8] net/bnxt: get maximum supported multicast filters count
  2022-03-07 15:10 [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Kalesh A P
                   ` (5 preceding siblings ...)
  2022-03-07 15:10 ` [PATCH 19.11 6/8] net/bnxt: fix handling of VF configuration change Kalesh A P
@ 2022-03-07 15:10 ` Kalesh A P
  2022-03-07 15:10 ` [PATCH 19.11 8/8] net/bnxt: fix xstats names query overrun Kalesh A P
  2022-03-09  8:02 ` [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Christian Ehrhardt
  8 siblings, 0 replies; 10+ messages in thread
From: Kalesh A P @ 2022-03-07 15:10 UTC (permalink / raw)
  To: stable; +Cc: christian.ehrhardt, ajit.khaparde

From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>

[ upstream commit bc9b2c20d29eea7cf1fbf098d69016bc4edb8c2e ]

The HWRM_FUNC_QCAPS response indicates the maximum number
of multicast filters that can be supported by this function
on the RX side.

Fixed to use this value instead of the hard coded value 16.

Fixes: d69851df12b2 ("net/bnxt: support multicast filter and set MAC addr")

Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
---
 drivers/net/bnxt/bnxt.h      | 3 ++-
 drivers/net/bnxt/bnxt_hwrm.c | 2 ++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index c850945..fd36252 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -711,10 +711,11 @@ struct bnxt {
 	struct bnxt_ring_stats	*prev_rx_ring_stats;
 	struct bnxt_ring_stats	*prev_tx_ring_stats;
 
-#define BNXT_MAX_MC_ADDRS	16
+#define BNXT_MAX_MC_ADDRS	((bp)->max_mcast_addr)
 	struct rte_ether_addr	*mcast_addr_list;
 	rte_iova_t		mc_list_dma_addr;
 	uint32_t		nb_mc_addr;
+	uint32_t		max_mcast_addr; /* maximum number of mcast filters supported */
 
 	struct rte_eth_rss_conf	rss_conf; /* RSS configuration. */
 };
diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c
index 472bb7c..90434d1 100644
--- a/drivers/net/bnxt/bnxt_hwrm.c
+++ b/drivers/net/bnxt/bnxt_hwrm.c
@@ -710,6 +710,8 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
 		bp->max_vnics = 1;
 	}
 	bp->max_stat_ctx = rte_le_to_cpu_16(resp->max_stat_ctx);
+	bp->max_mcast_addr = rte_le_to_cpu_32(resp->max_mcast_filters);
+
 	if (BNXT_PF(bp)) {
 		bp->pf.total_vnics = rte_le_to_cpu_16(resp->max_vnics);
 		if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_PTP_SUPPORTED) {
-- 
2.10.1


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

* [PATCH 19.11 8/8] net/bnxt: fix xstats names query overrun
  2022-03-07 15:10 [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Kalesh A P
                   ` (6 preceding siblings ...)
  2022-03-07 15:10 ` [PATCH 19.11 7/8] net/bnxt: get maximum supported multicast filters count Kalesh A P
@ 2022-03-07 15:10 ` Kalesh A P
  2022-03-09  8:02 ` [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Christian Ehrhardt
  8 siblings, 0 replies; 10+ messages in thread
From: Kalesh A P @ 2022-03-07 15:10 UTC (permalink / raw)
  To: stable; +Cc: christian.ehrhardt, ajit.khaparde

From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>

[ upstream commit 8dcee14fbfca8c90cd09c88e0fda65819d82ded6 ]

When the xstats_names parameter to rte_eth_xstats_get_names()
is non-NULL and the size parameter is less than the required
number of entries, the driver must return the required size
without modifying (and over-running) the caller's xstats_names
array.

Update bnxt_dev_xstats_get_names_op() in accordance with this
requirement.

Fixes: bfb9c2260be2 ("net/bnxt: support xstats get/reset")

Signed-off-by: Lance Richardson <lance.richardson@broadcom.com>
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
---
 drivers/net/bnxt/bnxt_stats.c | 61 ++++++++++++++++++++-----------------------
 1 file changed, 29 insertions(+), 32 deletions(-)

diff --git a/drivers/net/bnxt/bnxt_stats.c b/drivers/net/bnxt/bnxt_stats.c
index ca66ce1..39fd100 100644
--- a/drivers/net/bnxt/bnxt_stats.c
+++ b/drivers/net/bnxt/bnxt_stats.c
@@ -597,7 +597,7 @@ int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
 
 int bnxt_dev_xstats_get_names_op(__rte_unused struct rte_eth_dev *eth_dev,
 	struct rte_eth_xstat_name *xstats_names,
-	__rte_unused unsigned int limit)
+	unsigned int size)
 {
 	/* Account for the Tx drop pkts aka the Anti spoof counter */
 	const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
@@ -605,52 +605,49 @@ int bnxt_dev_xstats_get_names_op(__rte_unused struct rte_eth_dev *eth_dev,
 				RTE_DIM(bnxt_rx_ext_stats_strings) +
 				RTE_DIM(bnxt_tx_ext_stats_strings);
 	struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
-	unsigned int i, count;
+	unsigned int i, count = 0;
 	int rc;
 
 	rc = is_bnxt_in_error(bp);
 	if (rc)
 		return rc;
 
-	if (xstats_names != NULL) {
-		count = 0;
-
-		for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
-			strlcpy(xstats_names[count].name,
-				bnxt_rx_stats_strings[i].name,
-				sizeof(xstats_names[count].name));
-			count++;
-		}
-
-		for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
-			strlcpy(xstats_names[count].name,
-				bnxt_tx_stats_strings[i].name,
-				sizeof(xstats_names[count].name));
-			count++;
-		}
+	if (xstats_names != NULL || size < stat_cnt)
+		return stat_cnt;
 
+	for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
 		strlcpy(xstats_names[count].name,
-			bnxt_func_stats_strings[4].name,
+			bnxt_rx_stats_strings[i].name,
 			sizeof(xstats_names[count].name));
 		count++;
+	}
 
-		for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {
-			strlcpy(xstats_names[count].name,
-				bnxt_rx_ext_stats_strings[i].name,
-				sizeof(xstats_names[count].name));
-
-			count++;
-		}
+	for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
+		strlcpy(xstats_names[count].name,
+			bnxt_tx_stats_strings[i].name,
+			sizeof(xstats_names[count].name));
+		count++;
+	}
 
-		for (i = 0; i < RTE_DIM(bnxt_tx_ext_stats_strings); i++) {
-			strlcpy(xstats_names[count].name,
-				bnxt_tx_ext_stats_strings[i].name,
-				sizeof(xstats_names[count].name));
+	strlcpy(xstats_names[count].name,
+		bnxt_func_stats_strings[4].name,
+		sizeof(xstats_names[count].name));
+	count++;
 
-			count++;
-		}
+	for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {
+		strlcpy(xstats_names[count].name,
+			bnxt_rx_ext_stats_strings[i].name,
+			sizeof(xstats_names[count].name));
+		count++;
+	}
 
+	for (i = 0; i < RTE_DIM(bnxt_tx_ext_stats_strings); i++) {
+		strlcpy(xstats_names[count].name,
+			bnxt_tx_ext_stats_strings[i].name,
+			sizeof(xstats_names[count].name));
+		count++;
 	}
+
 	return stat_cnt;
 }
 
-- 
2.10.1


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

* Re: [PATCH 19.11 0/8] bnxt fixes backport to 19.11
  2022-03-07 15:10 [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Kalesh A P
                   ` (7 preceding siblings ...)
  2022-03-07 15:10 ` [PATCH 19.11 8/8] net/bnxt: fix xstats names query overrun Kalesh A P
@ 2022-03-09  8:02 ` Christian Ehrhardt
  8 siblings, 0 replies; 10+ messages in thread
From: Christian Ehrhardt @ 2022-03-09  8:02 UTC (permalink / raw)
  To: Kalesh A P; +Cc: stable, ajit.khaparde

On Mon, Mar 7, 2022 at 4:10 PM Kalesh A P
<kalesh-anakkur.purayil@broadcom.com> wrote:
>
> From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
>
> Backport of bnxt PMD fixes to 19.11 LTS.
>
> Kalesh AP (8):
>   net/bnxt: fix queue stop operation
>   net/bnxt: cap maximum number of unicast MAC addresses
>   net/bnxt: fix multicast address set
>   net/bnxt: restore RSS configuration after reset recovery
>   net/bnxt: fix memzone allocation per VNIC
>   net/bnxt: fix handling of VF configuration change
>   net/bnxt: get maximum supported multicast filters count
>   net/bnxt: fix xstats names query overrun

Thank you Kalesh,
I applied all 8 patches of the submission to 19.11-wip

P.S. I'll see later if one causes trouble and would let you know in that case.

>  drivers/net/bnxt/bnxt.h        | 12 +++++-
>  drivers/net/bnxt/bnxt_cpr.c    | 18 +++++++++
>  drivers/net/bnxt/bnxt_ethdev.c | 84 ++++++++++++++++++++++++++++++++---------
>  drivers/net/bnxt/bnxt_hwrm.c   | 29 +++++++++++++-
>  drivers/net/bnxt/bnxt_hwrm.h   |  1 +
>  drivers/net/bnxt/bnxt_rxq.c    |  5 ++-
>  drivers/net/bnxt/bnxt_stats.c  | 61 ++++++++++++++----------------
>  drivers/net/bnxt/bnxt_vnic.c   | 85 +++++++++++++++++++-----------------------
>  drivers/net/bnxt/bnxt_vnic.h   |  7 +---
>  9 files changed, 196 insertions(+), 106 deletions(-)
>
> --
> 2.10.1
>


-- 
Christian Ehrhardt
Staff Engineer, Ubuntu Server
Canonical Ltd

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

end of thread, other threads:[~2022-03-09  8:02 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-07 15:10 [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Kalesh A P
2022-03-07 15:10 ` [PATCH 19.11 1/8] net/bnxt: fix queue stop operation Kalesh A P
2022-03-07 15:10 ` [PATCH 19.11 2/8] net/bnxt: cap maximum number of unicast MAC addresses Kalesh A P
2022-03-07 15:10 ` [PATCH 19.11 3/8] net/bnxt: fix multicast address set Kalesh A P
2022-03-07 15:10 ` [PATCH 19.11 4/8] net/bnxt: restore RSS configuration after reset recovery Kalesh A P
2022-03-07 15:10 ` [PATCH 19.11 5/8] net/bnxt: fix memzone allocation per VNIC Kalesh A P
2022-03-07 15:10 ` [PATCH 19.11 6/8] net/bnxt: fix handling of VF configuration change Kalesh A P
2022-03-07 15:10 ` [PATCH 19.11 7/8] net/bnxt: get maximum supported multicast filters count Kalesh A P
2022-03-07 15:10 ` [PATCH 19.11 8/8] net/bnxt: fix xstats names query overrun Kalesh A P
2022-03-09  8:02 ` [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Christian Ehrhardt

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).