Ensure that the current count of in-use VNICs is decremented when a VNIC is freed. Don't attempt VNIC allocation when the maximum supported number of VNICs is currently allocated. Fixes: 49d0709b257f ("net/bnxt: delete and flush L2 filters cleanly") Fixes: d24610f7bfda ("net/bnxt: allow flow creation when RSS is enabled") Cc: stable@dpdk.org Signed-off-by: Lance Richardson Reviewed-by: Ajit Kumar Khaparde --- drivers/net/bnxt/bnxt.h | 2 +- drivers/net/bnxt/bnxt_flow.c | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h index bd2dec4d63..a385710846 100644 --- a/drivers/net/bnxt/bnxt.h +++ b/drivers/net/bnxt/bnxt.h @@ -719,7 +719,7 @@ struct bnxt { uint32_t max_ring_grps; struct bnxt_ring_grp_info *grp_info; - unsigned int nr_vnics; + uint16_t nr_vnics; #define BNXT_GET_DEFAULT_VNIC(bp) (&(bp)->vnic_info[0]) struct bnxt_vnic_info *vnic_info; diff --git a/drivers/net/bnxt/bnxt_flow.c b/drivers/net/bnxt/bnxt_flow.c index 844bf1520f..73fd24cd9a 100644 --- a/drivers/net/bnxt/bnxt_flow.c +++ b/drivers/net/bnxt/bnxt_flow.c @@ -925,6 +925,9 @@ static int bnxt_vnic_prep(struct bnxt *bp, struct bnxt_vnic_info *vnic) uint64_t rx_offloads = dev_conf->rxmode.offloads; int rc; + if (bp->nr_vnics > bp->max_vnics - 1) + return -ENOMEM; + rc = bnxt_vnic_grp_alloc(bp, vnic); if (rc) goto ret; @@ -1550,6 +1553,7 @@ bnxt_flow_validate(struct rte_eth_dev *dev, bnxt_hwrm_vnic_ctx_free(bp, vnic); bnxt_hwrm_vnic_free(bp, vnic); vnic->rx_queue_cnt = 0; + bp->nr_vnics--; PMD_DRV_LOG(DEBUG, "Free VNIC\n"); } } @@ -2011,6 +2015,7 @@ _bnxt_flow_destroy(struct bnxt *bp, bnxt_hwrm_vnic_free(bp, vnic); vnic->rx_queue_cnt = 0; + bp->nr_vnics--; } } else { rte_flow_error_set(error, -ret, -- 2.25.1