From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 0EDDBA0A0A for ; Thu, 20 May 2021 11:55:34 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0739740041; Thu, 20 May 2021 11:55:34 +0200 (CEST) Received: from relay.smtp-ext.broadcom.com (lpdvacalvio01.broadcom.com [192.19.229.182]) by mails.dpdk.org (Postfix) with ESMTP id 7ADB7410F7 for ; Thu, 20 May 2021 11:55:30 +0200 (CEST) Received: from dhcp-10-123-153-22.dhcp.broadcom.net (bgccx-dev-host-lnx2.bec.broadcom.net [10.123.153.22]) by relay.smtp-ext.broadcom.com (Postfix) with ESMTP id 35BC924706 for ; Thu, 20 May 2021 02:55:28 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 relay.smtp-ext.broadcom.com 35BC924706 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1621504529; bh=AUdNhYThPHmoHm9m3orGGqM+dKpDk3ON+aBWPYf4GP8=; h=From:To:Subject:Date:In-Reply-To:References:From; b=cjp3qDZ54laEtit3BTt7EuXXt2iB8AL4Dg8+cPwBhJWOimzibs0aOdKZQ+824xFSB OWAgn2sU9lD6z/mruATXNUHFcG/4oEq8XZ4H0FofgTGd0K7qJd2MCbqAjSb7ptUg0F 0XQGLladNr1KyHaDAilGuJMgIR7FMr4DGWXi628Q= From: Kalesh A P To: stable@dpdk.org Date: Thu, 20 May 2021 15:46:52 +0530 Message-Id: <20210520101654.3214-8-kalesh-anakkur.purayil@broadcom.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20210520101654.3214-1-kalesh-anakkur.purayil@broadcom.com> References: <20210520101654.3214-1-kalesh-anakkur.purayil@broadcom.com> Subject: [dpdk-stable] [PATCH 19.11 7/9] net/bnxt: fix VF info allocation X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" From: Kalesh AP [ upstream commit 01406837bf49950fa3a3fdd9d62eb7e0819383e4 ] 1. Renamed bnxt_hwrm_alloc_vf_info()/bnxt_hwrm_free_vf_info to bnxt_alloc_vf_info()/bnxt_free_vf_info as it does not issue any HWRM command to fw. 2. Fix missing unlock when memory allocation fails. Fixes: b7778e8a1c00 ("net/bnxt: refactor to properly allocate resources for PF/VF") Signed-off-by: Kalesh AP Reviewed-by: Ajit Khaparde --- drivers/net/bnxt/bnxt_ethdev.c | 2 +- drivers/net/bnxt/bnxt_hwrm.c | 93 +++++++++++++++++++++++++----------------- drivers/net/bnxt/bnxt_hwrm.h | 2 +- 3 files changed, 57 insertions(+), 40 deletions(-) diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 08f56a3..a49ec72 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -5105,7 +5105,7 @@ bnxt_dev_uninit(struct rte_eth_dev *eth_dev) if (eth_dev->data->dev_started) bnxt_dev_close_op(eth_dev); - bnxt_hwrm_free_vf_info(bp); + bnxt_free_vf_info(bp); eth_dev->dev_ops = NULL; eth_dev->rx_pkt_burst = NULL; eth_dev->tx_pkt_burst = NULL; diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index 4e3dfff..d1f6d23 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -589,10 +589,13 @@ static int bnxt_hwrm_ptp_qcfg(struct bnxt *bp) return 0; } -void bnxt_hwrm_free_vf_info(struct bnxt *bp) +void bnxt_free_vf_info(struct bnxt *bp) { uint16_t i; + if (bp->pf.vf_info == NULL) + return; + for (i = 0; i < bp->pf.max_vfs; i++) { rte_free(bp->pf.vf_info[i].vlan_table); bp->pf.vf_info[i].vlan_table = NULL; @@ -603,6 +606,50 @@ void bnxt_hwrm_free_vf_info(struct bnxt *bp) bp->pf.vf_info = NULL; } +static int bnxt_alloc_vf_info(struct bnxt *bp, uint16_t max_vfs) +{ + struct bnxt_child_vf_info *vf_info = bp->pf.vf_info; + int i; + + if (vf_info) + bnxt_free_vf_info(bp); + + vf_info = rte_zmalloc("bnxt_vf_info", sizeof(*vf_info) * max_vfs, 0); + if (vf_info == NULL) { + PMD_DRV_LOG(ERR, "Failed to alloc vf info\n"); + return -ENOMEM; + } + + bp->pf.max_vfs = max_vfs; + for (i = 0; i < max_vfs; i++) { + vf_info[i].fid = bp->pf.first_vf_id + i; + vf_info[i].vlan_table = rte_zmalloc("VF VLAN table", + getpagesize(), getpagesize()); + if (vf_info[i].vlan_table == NULL) { + PMD_DRV_LOG(ERR, "Failed to alloc VLAN table for VF %d\n", i); + goto err; + } + rte_mem_lock_page(vf_info[i].vlan_table); + + vf_info[i].vlan_as_table = rte_zmalloc("VF VLAN AS table", + getpagesize(), getpagesize()); + if (vf_info[i].vlan_as_table == NULL) { + PMD_DRV_LOG(ERR, "Failed to alloc VLAN AS table for VF %d\n", i); + goto err; + } + rte_mem_lock_page(vf_info[i].vlan_as_table); + + STAILQ_INIT(&vf_info[i].filter); + } + + bp->pf.vf_info = vf_info; + + return 0; +err: + bnxt_free_vf_info(bp); + return -ENOMEM; +} + static int __bnxt_hwrm_func_qcaps(struct bnxt *bp) { int rc = 0; @@ -610,7 +657,6 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp) struct hwrm_func_qcaps_output *resp = bp->hwrm_cmd_resp_addr; uint16_t new_max_vfs; uint32_t flags; - int i; HWRM_PREP(req, FUNC_QCAPS, BNXT_USE_CHIMP_MB); @@ -628,42 +674,9 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp) bp->pf.total_vfs = rte_le_to_cpu_16(resp->max_vfs); new_max_vfs = bp->pdev->max_vfs; if (new_max_vfs != bp->pf.max_vfs) { - if (bp->pf.vf_info) - bnxt_hwrm_free_vf_info(bp); - bp->pf.vf_info = rte_zmalloc("bnxt_vf_info", - sizeof(bp->pf.vf_info[0]) * new_max_vfs, 0); - if (bp->pf.vf_info == NULL) { - PMD_DRV_LOG(ERR, "Alloc vf info fail\n"); - HWRM_UNLOCK(); - return -ENOMEM; - } - bp->pf.max_vfs = new_max_vfs; - for (i = 0; i < new_max_vfs; i++) { - bp->pf.vf_info[i].fid = bp->pf.first_vf_id + i; - bp->pf.vf_info[i].vlan_table = - rte_zmalloc("VF VLAN table", - getpagesize(), - getpagesize()); - if (bp->pf.vf_info[i].vlan_table == NULL) - PMD_DRV_LOG(ERR, - "Fail to alloc VLAN table for VF %d\n", - i); - else - rte_mem_lock_page( - bp->pf.vf_info[i].vlan_table); - bp->pf.vf_info[i].vlan_as_table = - rte_zmalloc("VF VLAN AS table", - getpagesize(), - getpagesize()); - if (bp->pf.vf_info[i].vlan_as_table == NULL) - PMD_DRV_LOG(ERR, - "Alloc VLAN AS table for VF %d fail\n", - i); - else - rte_mem_lock_page( - bp->pf.vf_info[i].vlan_as_table); - STAILQ_INIT(&bp->pf.vf_info[i].filter); - } + rc = bnxt_alloc_vf_info(bp, new_max_vfs); + if (rc) + goto unlock; } } @@ -717,6 +730,7 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp) if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_HOT_RESET_CAPABLE) bp->fw_cap |= BNXT_FW_CAP_HOT_RESET; +unlock: HWRM_UNLOCK(); return rc; @@ -727,6 +741,9 @@ int bnxt_hwrm_func_qcaps(struct bnxt *bp) int rc; rc = __bnxt_hwrm_func_qcaps(bp); + if (rc == -ENOMEM) + return rc; + if (!rc && bp->hwrm_spec_code >= HWRM_SPEC_CODE_1_8_3) { rc = bnxt_alloc_ctx_mem(bp); if (rc) diff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h index ccc1bf9..7b2432f 100644 --- a/drivers/net/bnxt/bnxt_hwrm.h +++ b/drivers/net/bnxt/bnxt_hwrm.h @@ -88,7 +88,7 @@ int bnxt_hwrm_func_buf_rgtr(struct bnxt *bp); int bnxt_hwrm_func_buf_unrgtr(struct bnxt *bp); int bnxt_hwrm_func_driver_register(struct bnxt *bp); int bnxt_hwrm_func_qcaps(struct bnxt *bp); -void bnxt_hwrm_free_vf_info(struct bnxt *bp); +void bnxt_free_vf_info(struct bnxt *bp); int bnxt_hwrm_func_reset(struct bnxt *bp); int bnxt_hwrm_func_driver_unregister(struct bnxt *bp, uint32_t flags); int bnxt_hwrm_func_qstats(struct bnxt *bp, uint16_t fid, -- 2.10.1