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

Reply via email to