This fixes the issue of not freeing memzone in a call to free the memory for adminq DMA.
Fixes: 4861cde46116 ("i40e: new poll mode driver") Signed-off-by: Helin Zhang <helin.zhang at intel.com> --- doc/guides/rel_notes/release_2_2.rst | 5 +++++ drivers/net/i40e/base/i40e_osdep.h | 2 +- drivers/net/i40e/i40e_ethdev.c | 14 +++++++++----- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/doc/guides/rel_notes/release_2_2.rst b/doc/guides/rel_notes/release_2_2.rst index 59dda59..eaa906c 100644 --- a/doc/guides/rel_notes/release_2_2.rst +++ b/doc/guides/rel_notes/release_2_2.rst @@ -150,6 +150,11 @@ Drivers Added discarding packets on VSI to the stats and rectify the old statistics. +* **i40e: Fixed issue of not freeing memzone.** + + Fixed the issue of not freeing memzone in the call to free the memory for + adminq DMA. + * **vhost: Fixed Qemu shutdown.** Fixed issue with libvirt ``virsh destroy`` not killing the VM. diff --git a/drivers/net/i40e/base/i40e_osdep.h b/drivers/net/i40e/base/i40e_osdep.h index 70d2721..71077f0 100644 --- a/drivers/net/i40e/base/i40e_osdep.h +++ b/drivers/net/i40e/base/i40e_osdep.h @@ -146,7 +146,7 @@ struct i40e_dma_mem { void *va; u64 pa; u32 size; - u64 id; + const void *zone; } __attribute__((packed)); #define i40e_allocate_dma_mem(h, m, unused, s, a) \ diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index ddf3d38..9f06ec2 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -2910,15 +2910,13 @@ i40e_allocate_dma_mem_d(__attribute__((unused)) struct i40e_hw *hw, u64 size, u32 alignment) { - static uint64_t id = 0; const struct rte_memzone *mz = NULL; char z_name[RTE_MEMZONE_NAMESIZE]; if (!mem) return I40E_ERR_PARAM; - id++; - snprintf(z_name, sizeof(z_name), "i40e_dma_%"PRIu64, id); + snprintf(z_name, sizeof(z_name), "i40e_dma_%"PRIu64, rte_rand()); #ifdef RTE_LIBRTE_XEN_DOM0 mz = rte_memzone_reserve_bounded(z_name, size, SOCKET_ID_ANY, 0, alignment, RTE_PGSIZE_2M); @@ -2929,7 +2927,6 @@ i40e_allocate_dma_mem_d(__attribute__((unused)) struct i40e_hw *hw, if (!mz) return I40E_ERR_NO_MEMORY; - mem->id = id; mem->size = size; mem->va = mz->addr; #ifdef RTE_LIBRTE_XEN_DOM0 @@ -2937,6 +2934,9 @@ i40e_allocate_dma_mem_d(__attribute__((unused)) struct i40e_hw *hw, #else mem->pa = mz->phys_addr; #endif + mem->zone = (const void *)mz; + PMD_DRV_LOG(DEBUG, "memzone %s allocated with physical address: %p", + mz->name, mem->pa); return I40E_SUCCESS; } @@ -2950,9 +2950,13 @@ enum i40e_status_code i40e_free_dma_mem_d(__attribute__((unused)) struct i40e_hw *hw, struct i40e_dma_mem *mem) { - if (!mem || !mem->va) + if (!mem) return I40E_ERR_PARAM; + PMD_DRV_LOG(DEBUG, "memzone %s to be freed with physical address: %p", + ((const struct rte_memzone *)mem->zone)->name, mem->pa); + rte_memzone_free((const struct rte_memzone *)mem->zone); + mem->zone = NULL; mem->va = NULL; mem->pa = (u64)0; -- 1.9.3