]> git.droids-corp.org - dpdk.git/commitdiff
net/bnxt: cleanup and check ULP context allocation
authorSomnath Kotur <somnath.kotur@broadcom.com>
Wed, 29 Jul 2020 14:04:58 +0000 (19:34 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 18 Sep 2020 16:55:07 +0000 (18:55 +0200)
Set ulp_ctx explicitly to NULL in ulp_ctx_deinit() so that representor
init is aborted if parent ulp context is not initialized.
Also check for the same before creation of port default rules.
Additional checks added in VF rep dev ops for proper parent dev
initialization, to avoid null pointer dereference.

Fixes: 322bd6e70272 ("net/bnxt: add port representor infrastructure")
Fixes: 313ac35ac701 ("net/bnxt: support ULP session manager init")
Cc: stable@dpdk.org
Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
drivers/net/bnxt/bnxt_reps.c
drivers/net/bnxt/tf_ulp/bnxt_ulp.c
drivers/net/bnxt/tf_ulp/ulp_def_rules.c

index 6fa9a30d276c11eda222be6d59334c7837b6c672..2941aff7b13eb73ff050ff50b3eed7ec0b0dd4de 100644 (file)
@@ -319,6 +319,7 @@ static int bnxt_vfr_alloc(struct rte_eth_dev *vfr_ethdev)
 {
        int rc = 0;
        struct bnxt_vf_representor *vfr = vfr_ethdev->data->dev_private;
+       struct bnxt *parent_bp;
 
        if (!vfr || !vfr->parent_dev) {
                PMD_DRV_LOG(ERR,
@@ -326,6 +327,13 @@ static int bnxt_vfr_alloc(struct rte_eth_dev *vfr_ethdev)
                return -ENOMEM;
        }
 
+       parent_bp = vfr->parent_dev->data->dev_private;
+       if (parent_bp && !parent_bp->ulp_ctx) {
+               PMD_DRV_LOG(ERR,
+                           "ulp context not allocated for parent\n");
+               return -EIO;
+       }
+
        /* Check if representor has been already allocated in FW */
        if (vfr->vfr_tx_cfa_action)
                return 0;
@@ -534,6 +542,11 @@ int bnxt_vf_rep_rx_queue_setup_op(struct rte_eth_dev *eth_dev,
                return -EINVAL;
        }
 
+       if (!parent_bp->rx_queues) {
+               PMD_DRV_LOG(ERR, "Parent Rx qs not configured yet\n");
+               return -EINVAL;
+       }
+
        parent_rxq = parent_bp->rx_queues[queue_idx];
        if (!parent_rxq) {
                PMD_DRV_LOG(ERR, "Parent RxQ has not been configured yet\n");
@@ -628,6 +641,11 @@ int bnxt_vf_rep_tx_queue_setup_op(struct rte_eth_dev *eth_dev,
                return -EINVAL;
        }
 
+       if (!parent_bp->tx_queues) {
+               PMD_DRV_LOG(ERR, "Parent Tx qs not configured yet\n");
+               return -EINVAL;
+       }
+
        parent_txq = parent_bp->tx_queues[queue_idx];
        if (!parent_txq) {
                PMD_DRV_LOG(ERR, "Parent TxQ has not been configured yet\n");
index 263040ee4cbc796d137182b3aab3eb4c33e64419..0d4a45513493a1b35f53e44e584313953bb04e62 100644 (file)
@@ -884,6 +884,8 @@ bnxt_ulp_deinit(struct bnxt *bp)
        ulp_session_deinit(session);
 
        rte_free(bp->ulp_ctx);
+
+       bp->ulp_ctx = NULL;
 }
 
 /* Function to set the Mark DB into the context */
index 9fb1a028ff668b5d08f0a7b984aea3c97dc872f2..46acc1d65a8cd3a7b1dd998f44e47c045c070e3d 100644 (file)
@@ -465,7 +465,7 @@ bnxt_ulp_create_df_rules(struct bnxt *bp)
        int rc;
 
        if (!BNXT_TRUFLOW_EN(bp) ||
-           BNXT_ETH_DEV_IS_REPRESENTOR(bp->eth_dev))
+           BNXT_ETH_DEV_IS_REPRESENTOR(bp->eth_dev) || !bp->ulp_ctx)
                return 0;
 
        port_id = bp->eth_dev->data->port_id;