net/bnxt: fix ring calculation for representors

Message ID 20220209055811.88850-1-ajit.khaparde@broadcom.com (mailing list archive)
State Superseded, archived
Delegated to: Ajit Khaparde
Headers
Series net/bnxt: fix ring calculation for representors |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK
ci/intel-Testing success Testing PASS
ci/github-robot: build success github build: passed
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-broadcom-Functional success Functional Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-aarch64-unit-testing success Testing PASS
ci/iol-x86_64-compile-testing success Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS
ci/iol-abi-testing success Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS

Commit Message

Ajit Khaparde Feb. 9, 2022, 5:58 a.m. UTC
  Currently the Tx and Rx ring count for representors is fixed.
It does not consider the number of rings created for the parent
function. And that can cause issues not only during initialization
but while running traffic.
Instead check the number of rings created for the parent function
while configuring the ring resources for representors.

Fixes: 322bd6e70272 ("net/bnxt: add port representor infrastructure")
Cc: stable@dpdk.org

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

Comments

Ajit Khaparde Feb. 9, 2022, 3:37 p.m. UTC | #1
On Tue, Feb 8, 2022 at 9:58 PM Ajit Khaparde <ajit.khaparde@broadcom.com> wrote:
>
> Currently the Tx and Rx ring count for representors is fixed.
> It does not consider the number of rings created for the parent
> function. And that can cause issues not only during initialization
> but while running traffic.
> Instead check the number of rings created for the parent function
> while configuring the ring resources for representors.
>
> Fixes: 322bd6e70272 ("net/bnxt: add port representor infrastructure")
> Cc: stable@dpdk.org
>
> Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
> Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
> Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Patch applied to dpdk-next-net-brcm.

> ---
>  drivers/net/bnxt/bnxt.h      |  2 +-
>  drivers/net/bnxt/bnxt_reps.c | 19 ++++++++++---------
>  2 files changed, 11 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
> index 433f1c80be..0cbb58b2cf 100644
> --- a/drivers/net/bnxt/bnxt.h
> +++ b/drivers/net/bnxt/bnxt.h
> @@ -831,7 +831,7 @@ struct bnxt {
>         uint16_t                max_tx_rings;
>         uint16_t                max_rx_rings;
>  #define MAX_STINGRAY_RINGS             236U
> -#define BNXT_MAX_VF_REP_RINGS  8
> +#define BNXT_MAX_VF_REP_RINGS  8U
>
>         uint16_t                max_nq_rings;
>         uint16_t                max_l2_ctx;
> diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c
> index 5e140f0cdb..9ae8848382 100644
> --- a/drivers/net/bnxt/bnxt_reps.c
> +++ b/drivers/net/bnxt/bnxt_reps.c
> @@ -548,7 +548,8 @@ int bnxt_rep_dev_info_get_op(struct rte_eth_dev *eth_dev,
>         dev_info->max_mac_addrs = parent_bp->max_l2_ctx;
>         dev_info->max_hash_mac_addrs = 0;
>
> -       max_rx_rings = BNXT_MAX_VF_REP_RINGS;
> +       max_rx_rings = RTE_MIN(parent_bp->rx_nr_rings, BNXT_MAX_VF_REP_RINGS);
> +
>         /* For the sake of symmetry, max_rx_queues = max_tx_queues */
>         dev_info->max_rx_queues = max_rx_rings;
>         dev_info->max_tx_queues = max_rx_rings;
> @@ -629,10 +630,10 @@ int bnxt_rep_rx_queue_setup_op(struct rte_eth_dev *eth_dev,
>         struct rte_mbuf **buf_ring;
>         int rc = 0;
>
> -       if (queue_idx >= BNXT_MAX_VF_REP_RINGS) {
> +       if (queue_idx >= rep_bp->rx_nr_rings) {
>                 PMD_DRV_LOG(ERR,
>                             "Cannot create Rx ring %d. %d rings available\n",
> -                           queue_idx, BNXT_MAX_VF_REP_RINGS);
> +                           queue_idx, rep_bp->rx_nr_rings);
>                 return -EINVAL;
>         }
>
> @@ -729,10 +730,10 @@ int bnxt_rep_tx_queue_setup_op(struct rte_eth_dev *eth_dev,
>         struct bnxt_tx_queue *parent_txq, *txq;
>         struct bnxt_vf_rep_tx_queue *vfr_txq;
>
> -       if (queue_idx >= BNXT_MAX_VF_REP_RINGS) {
> +       if (queue_idx >= rep_bp->rx_nr_rings) {
>                 PMD_DRV_LOG(ERR,
>                             "Cannot create Tx rings %d. %d rings available\n",
> -                           queue_idx, BNXT_MAX_VF_REP_RINGS);
> +                           queue_idx, rep_bp->rx_nr_rings);
>                 return -EINVAL;
>         }
>
> @@ -805,10 +806,10 @@ int bnxt_rep_stats_get_op(struct rte_eth_dev *eth_dev,
>                              struct rte_eth_stats *stats)
>  {
>         struct bnxt_representor *rep_bp = eth_dev->data->dev_private;
> -       int i;
> +       unsigned int i;
>
>         memset(stats, 0, sizeof(*stats));
> -       for (i = 0; i < BNXT_MAX_VF_REP_RINGS; i++) {
> +       for (i = 0; i < rep_bp->rx_nr_rings; i++) {
>                 stats->obytes += rep_bp->tx_bytes[i];
>                 stats->opackets += rep_bp->tx_pkts[i];
>                 stats->ibytes += rep_bp->rx_bytes[i];
> @@ -828,9 +829,9 @@ int bnxt_rep_stats_get_op(struct rte_eth_dev *eth_dev,
>  int bnxt_rep_stats_reset_op(struct rte_eth_dev *eth_dev)
>  {
>         struct bnxt_representor *rep_bp = eth_dev->data->dev_private;
> -       int i;
> +       unsigned int i;
>
> -       for (i = 0; i < BNXT_MAX_VF_REP_RINGS; i++) {
> +       for (i = 0; i < rep_bp->rx_nr_rings; i++) {
>                 rep_bp->tx_pkts[i] = 0;
>                 rep_bp->tx_bytes[i] = 0;
>                 rep_bp->rx_pkts[i] = 0;
> --
> 2.32.0 (Apple Git-132)
>
  
Ajit Khaparde Feb. 9, 2022, 5:34 p.m. UTC | #2
On Wed, Feb 9, 2022 at 7:37 AM Ajit Khaparde <ajit.khaparde@broadcom.com> wrote:
>
> On Tue, Feb 8, 2022 at 9:58 PM Ajit Khaparde <ajit.khaparde@broadcom.com> wrote:
> >
> > Currently the Tx and Rx ring count for representors is fixed.
> > It does not consider the number of rings created for the parent
> > function. And that can cause issues not only during initialization
> > but while running traffic.
> > Instead check the number of rings created for the parent function
> > while configuring the ring resources for representors.
> >
> > Fixes: 322bd6e70272 ("net/bnxt: add port representor infrastructure")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
> > Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
> > Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
> Patch applied to dpdk-next-net-brcm.
Reverting and sending a fresh version.

>
> > ---
> >  drivers/net/bnxt/bnxt.h      |  2 +-
> >  drivers/net/bnxt/bnxt_reps.c | 19 ++++++++++---------
> >  2 files changed, 11 insertions(+), 10 deletions(-)
> >
> > diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
> > index 433f1c80be..0cbb58b2cf 100644
> > --- a/drivers/net/bnxt/bnxt.h
> > +++ b/drivers/net/bnxt/bnxt.h
> > @@ -831,7 +831,7 @@ struct bnxt {
> >         uint16_t                max_tx_rings;
> >         uint16_t                max_rx_rings;
> >  #define MAX_STINGRAY_RINGS             236U
> > -#define BNXT_MAX_VF_REP_RINGS  8
> > +#define BNXT_MAX_VF_REP_RINGS  8U
> >
> >         uint16_t                max_nq_rings;
> >         uint16_t                max_l2_ctx;
> > diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c
> > index 5e140f0cdb..9ae8848382 100644
> > --- a/drivers/net/bnxt/bnxt_reps.c
> > +++ b/drivers/net/bnxt/bnxt_reps.c
> > @@ -548,7 +548,8 @@ int bnxt_rep_dev_info_get_op(struct rte_eth_dev *eth_dev,
> >         dev_info->max_mac_addrs = parent_bp->max_l2_ctx;
> >         dev_info->max_hash_mac_addrs = 0;
> >
> > -       max_rx_rings = BNXT_MAX_VF_REP_RINGS;
> > +       max_rx_rings = RTE_MIN(parent_bp->rx_nr_rings, BNXT_MAX_VF_REP_RINGS);
> > +
> >         /* For the sake of symmetry, max_rx_queues = max_tx_queues */
> >         dev_info->max_rx_queues = max_rx_rings;
> >         dev_info->max_tx_queues = max_rx_rings;
> > @@ -629,10 +630,10 @@ int bnxt_rep_rx_queue_setup_op(struct rte_eth_dev *eth_dev,
> >         struct rte_mbuf **buf_ring;
> >         int rc = 0;
> >
> > -       if (queue_idx >= BNXT_MAX_VF_REP_RINGS) {
> > +       if (queue_idx >= rep_bp->rx_nr_rings) {
> >                 PMD_DRV_LOG(ERR,
> >                             "Cannot create Rx ring %d. %d rings available\n",
> > -                           queue_idx, BNXT_MAX_VF_REP_RINGS);
> > +                           queue_idx, rep_bp->rx_nr_rings);
> >                 return -EINVAL;
> >         }
> >
> > @@ -729,10 +730,10 @@ int bnxt_rep_tx_queue_setup_op(struct rte_eth_dev *eth_dev,
> >         struct bnxt_tx_queue *parent_txq, *txq;
> >         struct bnxt_vf_rep_tx_queue *vfr_txq;
> >
> > -       if (queue_idx >= BNXT_MAX_VF_REP_RINGS) {
> > +       if (queue_idx >= rep_bp->rx_nr_rings) {
> >                 PMD_DRV_LOG(ERR,
> >                             "Cannot create Tx rings %d. %d rings available\n",
> > -                           queue_idx, BNXT_MAX_VF_REP_RINGS);
> > +                           queue_idx, rep_bp->rx_nr_rings);
> >                 return -EINVAL;
> >         }
> >
> > @@ -805,10 +806,10 @@ int bnxt_rep_stats_get_op(struct rte_eth_dev *eth_dev,
> >                              struct rte_eth_stats *stats)
> >  {
> >         struct bnxt_representor *rep_bp = eth_dev->data->dev_private;
> > -       int i;
> > +       unsigned int i;
> >
> >         memset(stats, 0, sizeof(*stats));
> > -       for (i = 0; i < BNXT_MAX_VF_REP_RINGS; i++) {
> > +       for (i = 0; i < rep_bp->rx_nr_rings; i++) {
> >                 stats->obytes += rep_bp->tx_bytes[i];
> >                 stats->opackets += rep_bp->tx_pkts[i];
> >                 stats->ibytes += rep_bp->rx_bytes[i];
> > @@ -828,9 +829,9 @@ int bnxt_rep_stats_get_op(struct rte_eth_dev *eth_dev,
> >  int bnxt_rep_stats_reset_op(struct rte_eth_dev *eth_dev)
> >  {
> >         struct bnxt_representor *rep_bp = eth_dev->data->dev_private;
> > -       int i;
> > +       unsigned int i;
> >
> > -       for (i = 0; i < BNXT_MAX_VF_REP_RINGS; i++) {
> > +       for (i = 0; i < rep_bp->rx_nr_rings; i++) {
> >                 rep_bp->tx_pkts[i] = 0;
> >                 rep_bp->tx_bytes[i] = 0;
> >                 rep_bp->rx_pkts[i] = 0;
> > --
> > 2.32.0 (Apple Git-132)
> >
  

Patch

diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index 433f1c80be..0cbb58b2cf 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -831,7 +831,7 @@  struct bnxt {
 	uint16_t		max_tx_rings;
 	uint16_t		max_rx_rings;
 #define MAX_STINGRAY_RINGS		236U
-#define BNXT_MAX_VF_REP_RINGS	8
+#define BNXT_MAX_VF_REP_RINGS	8U
 
 	uint16_t		max_nq_rings;
 	uint16_t		max_l2_ctx;
diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c
index 5e140f0cdb..9ae8848382 100644
--- a/drivers/net/bnxt/bnxt_reps.c
+++ b/drivers/net/bnxt/bnxt_reps.c
@@ -548,7 +548,8 @@  int bnxt_rep_dev_info_get_op(struct rte_eth_dev *eth_dev,
 	dev_info->max_mac_addrs = parent_bp->max_l2_ctx;
 	dev_info->max_hash_mac_addrs = 0;
 
-	max_rx_rings = BNXT_MAX_VF_REP_RINGS;
+	max_rx_rings = RTE_MIN(parent_bp->rx_nr_rings, BNXT_MAX_VF_REP_RINGS);
+
 	/* For the sake of symmetry, max_rx_queues = max_tx_queues */
 	dev_info->max_rx_queues = max_rx_rings;
 	dev_info->max_tx_queues = max_rx_rings;
@@ -629,10 +630,10 @@  int bnxt_rep_rx_queue_setup_op(struct rte_eth_dev *eth_dev,
 	struct rte_mbuf **buf_ring;
 	int rc = 0;
 
-	if (queue_idx >= BNXT_MAX_VF_REP_RINGS) {
+	if (queue_idx >= rep_bp->rx_nr_rings) {
 		PMD_DRV_LOG(ERR,
 			    "Cannot create Rx ring %d. %d rings available\n",
-			    queue_idx, BNXT_MAX_VF_REP_RINGS);
+			    queue_idx, rep_bp->rx_nr_rings);
 		return -EINVAL;
 	}
 
@@ -729,10 +730,10 @@  int bnxt_rep_tx_queue_setup_op(struct rte_eth_dev *eth_dev,
 	struct bnxt_tx_queue *parent_txq, *txq;
 	struct bnxt_vf_rep_tx_queue *vfr_txq;
 
-	if (queue_idx >= BNXT_MAX_VF_REP_RINGS) {
+	if (queue_idx >= rep_bp->rx_nr_rings) {
 		PMD_DRV_LOG(ERR,
 			    "Cannot create Tx rings %d. %d rings available\n",
-			    queue_idx, BNXT_MAX_VF_REP_RINGS);
+			    queue_idx, rep_bp->rx_nr_rings);
 		return -EINVAL;
 	}
 
@@ -805,10 +806,10 @@  int bnxt_rep_stats_get_op(struct rte_eth_dev *eth_dev,
 			     struct rte_eth_stats *stats)
 {
 	struct bnxt_representor *rep_bp = eth_dev->data->dev_private;
-	int i;
+	unsigned int i;
 
 	memset(stats, 0, sizeof(*stats));
-	for (i = 0; i < BNXT_MAX_VF_REP_RINGS; i++) {
+	for (i = 0; i < rep_bp->rx_nr_rings; i++) {
 		stats->obytes += rep_bp->tx_bytes[i];
 		stats->opackets += rep_bp->tx_pkts[i];
 		stats->ibytes += rep_bp->rx_bytes[i];
@@ -828,9 +829,9 @@  int bnxt_rep_stats_get_op(struct rte_eth_dev *eth_dev,
 int bnxt_rep_stats_reset_op(struct rte_eth_dev *eth_dev)
 {
 	struct bnxt_representor *rep_bp = eth_dev->data->dev_private;
-	int i;
+	unsigned int i;
 
-	for (i = 0; i < BNXT_MAX_VF_REP_RINGS; i++) {
+	for (i = 0; i < rep_bp->rx_nr_rings; i++) {
 		rep_bp->tx_pkts[i] = 0;
 		rep_bp->tx_bytes[i] = 0;
 		rep_bp->rx_pkts[i] = 0;