]> git.droids-corp.org - dpdk.git/commitdiff
net/bnxt: fix memzone allocation per VNIC
authorKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Thu, 20 Jan 2022 09:12:27 +0000 (14:42 +0530)
committerAjit Khaparde <ajit.khaparde@broadcom.com>
Tue, 25 Jan 2022 04:45:28 +0000 (05:45 +0100)
In case of Thor RSS table size is too big. This could result in
memory allocation failure when the supported vnic count is high.
Instead of allocating the memzone for all VNICs in one shot,
allocate for each VNIC individually.

Also, fixed to free the memzone in the uninit path.

Fixes: 9738793f28ec ("net/bnxt: add VNIC functions and structs")
Cc: stable@dpdk.org
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
drivers/net/bnxt/bnxt_vnic.c
drivers/net/bnxt/bnxt_vnic.h

index 09d67ef885d8e588c594bc73acba9d87f735e39d..b3c03a2af584a1e4b5f66d8d5274f165cc5e1850 100644 (file)
@@ -98,18 +98,11 @@ void bnxt_free_vnic_attributes(struct bnxt *bp)
 
        for (i = 0; i < bp->max_vnics; i++) {
                vnic = &bp->vnic_info[i];
-               if (vnic->rss_table) {
-                       /* 'Unreserve' the rss_table */
-                       /* N/A */
-
-                       vnic->rss_table = NULL;
-               }
-
-               if (vnic->rss_hash_key) {
-                       /* 'Unreserve' the rss_hash_key */
-                       /* N/A */
-
+               if (vnic->rss_mz != NULL) {
+                       rte_memzone_free(vnic->rss_mz);
+                       vnic->rss_mz = NULL;
                        vnic->rss_hash_key = NULL;
+                       vnic->rss_table = NULL;
                }
        }
 }
@@ -122,7 +115,6 @@ int bnxt_alloc_vnic_attributes(struct bnxt *bp, bool reconfig)
        char mz_name[RTE_MEMZONE_NAMESIZE];
        uint32_t entry_length;
        size_t rss_table_size;
-       uint16_t max_vnics;
        int i;
        rte_iova_t mz_phys_addr;
 
@@ -136,38 +128,36 @@ int bnxt_alloc_vnic_attributes(struct bnxt *bp, bool reconfig)
 
        entry_length = RTE_CACHE_LINE_ROUNDUP(entry_length + rss_table_size);
 
-       max_vnics = bp->max_vnics;
-       snprintf(mz_name, RTE_MEMZONE_NAMESIZE,
-                "bnxt_" PCI_PRI_FMT "_vnicattr", pdev->addr.domain,
-                pdev->addr.bus, pdev->addr.devid, pdev->addr.function);
-       mz_name[RTE_MEMZONE_NAMESIZE - 1] = 0;
-       mz = rte_memzone_lookup(mz_name);
-       if (!mz) {
-               mz = rte_memzone_reserve(mz_name,
-                               entry_length * max_vnics,
-                               bp->eth_dev->device->numa_node,
-                               RTE_MEMZONE_2MB |
-                               RTE_MEMZONE_SIZE_HINT_ONLY |
-                               RTE_MEMZONE_IOVA_CONTIG);
-               if (!mz)
-                       return -ENOMEM;
-       }
-       mz_phys_addr = mz->iova;
-
-       for (i = 0; i < max_vnics; i++) {
+       for (i = 0; i < bp->max_vnics; i++) {
                vnic = &bp->vnic_info[i];
 
+               snprintf(mz_name, RTE_MEMZONE_NAMESIZE,
+                        "bnxt_" PCI_PRI_FMT "_vnicattr_%d", pdev->addr.domain,
+                        pdev->addr.bus, pdev->addr.devid, pdev->addr.function, i);
+               mz_name[RTE_MEMZONE_NAMESIZE - 1] = 0;
+               mz = rte_memzone_lookup(mz_name);
+               if (mz == NULL) {
+                       mz = rte_memzone_reserve(mz_name,
+                                                entry_length,
+                                                bp->eth_dev->device->numa_node,
+                                                RTE_MEMZONE_2MB |
+                                                RTE_MEMZONE_SIZE_HINT_ONLY |
+                                                RTE_MEMZONE_IOVA_CONTIG);
+                       if (mz == NULL) {
+                               PMD_DRV_LOG(ERR, "Cannot allocate bnxt vnic_attributes memory\n");
+                               return -ENOMEM;
+                       }
+               }
+               vnic->rss_mz = mz;
+               mz_phys_addr = mz->iova;
+
                /* Allocate rss table and hash key */
-               vnic->rss_table =
-                       (void *)((char *)mz->addr + (entry_length * i));
+               vnic->rss_table = (void *)((char *)mz->addr);
+               vnic->rss_table_dma_addr = mz_phys_addr;
                memset(vnic->rss_table, -1, entry_length);
 
-               vnic->rss_table_dma_addr = mz_phys_addr + (entry_length * i);
-               vnic->rss_hash_key = (void *)((char *)vnic->rss_table +
-                                             rss_table_size);
-
-               vnic->rss_hash_key_dma_addr = vnic->rss_table_dma_addr +
-                                             rss_table_size;
+               vnic->rss_hash_key = (void *)((char *)vnic->rss_table + rss_table_size);
+               vnic->rss_hash_key_dma_addr = vnic->rss_table_dma_addr + rss_table_size;
                if (!reconfig) {
                        bnxt_prandom_bytes(vnic->rss_hash_key, HW_HASH_KEY_SIZE);
                        memcpy(bp->rss_conf.rss_key, vnic->rss_hash_key, HW_HASH_KEY_SIZE);
index 25481fcbddf293efdb88dd8643d4e897e40dfd6b..9055b93c4ba0ecb62d00032a118b5a1d5c21179b 100644 (file)
@@ -28,6 +28,7 @@ struct bnxt_vnic_info {
        uint16_t        mru;
        uint16_t        hash_type;
        uint8_t         hash_mode;
+       const struct rte_memzone *rss_mz;
        rte_iova_t      rss_table_dma_addr;
        uint16_t        *rss_table;
        rte_iova_t      rss_hash_key_dma_addr;