[2/2] net/bnxt: cap max Rx rings for Thor
Checks
Commit Message
For Thor devices, RSS table can only accommodate 512 Rx queues.
When RSS is enabled, Cap the max Rx rings to 512.
For non-RSS case, the number will be limited by number of VNICs.
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Lance Richardson <lance.richardson@broadcom.com>
---
drivers/net/bnxt/bnxt.h | 13 +++++++++++++
drivers/net/bnxt/bnxt_ethdev.c | 7 ++++---
2 files changed, 17 insertions(+), 3 deletions(-)
Comments
On Mon, Apr 19, 2021 at 12:28 PM Ajit Khaparde
<ajit.khaparde@broadcom.com> wrote:
>
> For Thor devices, RSS table can only accommodate 512 Rx queues.
> When RSS is enabled, Cap the max Rx rings to 512.
> For non-RSS case, the number will be limited by number of VNICs.
>
> Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
> Reviewed-by: Lance Richardson <lance.richardson@broadcom.com>
Patch applied to dpdk-next-net-brcm.
Fixed the checkpatch error during merge.
> ---
> drivers/net/bnxt/bnxt.h | 13 +++++++++++++
> drivers/net/bnxt/bnxt_ethdev.c | 7 ++++---
> 2 files changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
> index 05f8804274..263ea86590 100644
> --- a/drivers/net/bnxt/bnxt.h
> +++ b/drivers/net/bnxt/bnxt.h
> @@ -844,6 +844,7 @@ struct bnxt {
> static
> inline uint16_t bnxt_max_rings(struct bnxt *bp)
> {
> + struct rte_eth_conf *dev_conf = &bp->eth_dev->data->dev_conf;
> uint16_t max_tx_rings = bp->max_tx_rings;
> uint16_t max_rx_rings = bp->max_rx_rings;
> uint16_t max_cp_rings = bp->max_cp_rings;
> @@ -861,6 +862,18 @@ inline uint16_t bnxt_max_rings(struct bnxt *bp)
> bp->max_stat_ctx / 2U);
> }
>
> + if (BNXT_CHIP_P5(bp)) {
> + /* RSS table size in Thor is 512.
> + * Cap max Rx rings to the same value for RSS.
> + * For non-RSS case cap it to the max VNIC count.
> + */
> + if(dev_conf->rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG)
> + max_rx_rings = RTE_MIN(max_rx_rings,
> + BNXT_RSS_TBL_SIZE_P5);
> + else
> + max_rx_rings = RTE_MIN(max_rx_rings, bp->max_vnics);
> + }
> +
> max_tx_rings = RTE_MIN(max_tx_rings, max_rx_rings);
> if (max_cp_rings > BNXT_NUM_ASYNC_CPR(bp))
> max_cp_rings -= BNXT_NUM_ASYNC_CPR(bp);
> diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
> index dc3b04110f..9da817f487 100644
> --- a/drivers/net/bnxt/bnxt_ethdev.c
> +++ b/drivers/net/bnxt/bnxt_ethdev.c
> @@ -422,12 +422,13 @@ static int bnxt_setup_one_vnic(struct bnxt *bp, uint16_t vnic_id)
> if (dev_conf->rxmode.mq_mode & ETH_MQ_RX_RSS) {
> int j, nr_ctxs = bnxt_rss_ctxts(bp);
>
> + /* RSS table size in Thor is 512.
> + * Cap max Rx rings to same value
> + */
> if (bp->rx_nr_rings > BNXT_RSS_TBL_SIZE_P5) {
> PMD_DRV_LOG(ERR, "RxQ cnt %d > reta_size %d\n",
> bp->rx_nr_rings, BNXT_RSS_TBL_SIZE_P5);
> - PMD_DRV_LOG(ERR,
> - "Only queues 0-%d will be in RSS table\n",
> - BNXT_RSS_TBL_SIZE_P5 - 1);
> + goto err_out;
> }
>
> rc = 0;
> --
> 2.21.1 (Apple Git-122.3)
>
@@ -844,6 +844,7 @@ struct bnxt {
static
inline uint16_t bnxt_max_rings(struct bnxt *bp)
{
+ struct rte_eth_conf *dev_conf = &bp->eth_dev->data->dev_conf;
uint16_t max_tx_rings = bp->max_tx_rings;
uint16_t max_rx_rings = bp->max_rx_rings;
uint16_t max_cp_rings = bp->max_cp_rings;
@@ -861,6 +862,18 @@ inline uint16_t bnxt_max_rings(struct bnxt *bp)
bp->max_stat_ctx / 2U);
}
+ if (BNXT_CHIP_P5(bp)) {
+ /* RSS table size in Thor is 512.
+ * Cap max Rx rings to the same value for RSS.
+ * For non-RSS case cap it to the max VNIC count.
+ */
+ if(dev_conf->rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG)
+ max_rx_rings = RTE_MIN(max_rx_rings,
+ BNXT_RSS_TBL_SIZE_P5);
+ else
+ max_rx_rings = RTE_MIN(max_rx_rings, bp->max_vnics);
+ }
+
max_tx_rings = RTE_MIN(max_tx_rings, max_rx_rings);
if (max_cp_rings > BNXT_NUM_ASYNC_CPR(bp))
max_cp_rings -= BNXT_NUM_ASYNC_CPR(bp);
@@ -422,12 +422,13 @@ static int bnxt_setup_one_vnic(struct bnxt *bp, uint16_t vnic_id)
if (dev_conf->rxmode.mq_mode & ETH_MQ_RX_RSS) {
int j, nr_ctxs = bnxt_rss_ctxts(bp);
+ /* RSS table size in Thor is 512.
+ * Cap max Rx rings to same value
+ */
if (bp->rx_nr_rings > BNXT_RSS_TBL_SIZE_P5) {
PMD_DRV_LOG(ERR, "RxQ cnt %d > reta_size %d\n",
bp->rx_nr_rings, BNXT_RSS_TBL_SIZE_P5);
- PMD_DRV_LOG(ERR,
- "Only queues 0-%d will be in RSS table\n",
- BNXT_RSS_TBL_SIZE_P5 - 1);
+ goto err_out;
}
rc = 0;