diff --git a/drivers/net/bnxt/bnxt_vnic.c b/drivers/net/bnxt/bnxt_vnic.c index f18e672dca..fd425e5d83 100644 --- a/drivers/net/bnxt/bnxt_vnic.c +++ b/drivers/net/bnxt/bnxt_vnic.c @@ -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); diff --git a/drivers/net/bnxt/bnxt_vnic.h b/drivers/net/bnxt/bnxt_vnic.h index 785db8f0cd..c07fd52b21 100644 --- a/drivers/net/bnxt/bnxt_vnic.h +++ b/drivers/net/bnxt/bnxt_vnic.h @@ -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;