although previous implementation returned an error when trying to release a
memzone assigned to an ivshmem device, it stills freed it.

Fixes: cd10c42eb5bc ("mem: fix ivshmem freeing")

Signed-off-by: Mauricio Vasquez B <mauricio.vasquezbernal at studenti.polito.it>
---
 lib/librte_eal/common/eal_common_memzone.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/lib/librte_eal/common/eal_common_memzone.c 
b/lib/librte_eal/common/eal_common_memzone.c
index 711c845..1fce906 100644
--- a/lib/librte_eal/common/eal_common_memzone.c
+++ b/lib/librte_eal/common/eal_common_memzone.c
@@ -321,15 +321,19 @@ rte_memzone_free(const struct rte_memzone *mz)
        idx = ((uintptr_t)mz - (uintptr_t)mcfg->memzone);
        idx = idx / sizeof(struct rte_memzone);

-       addr = mcfg->memzone[idx].addr;
 #ifdef RTE_LIBRTE_IVSHMEM
        /*
         * If ioremap_addr is set, it's an IVSHMEM memzone and we cannot
         * free it.
         */
-       if (mcfg->memzone[idx].ioremap_addr != 0)
+       if (mcfg->memzone[idx].ioremap_addr != 0) {
                ret = -EINVAL;
+               goto error;
+       }
 #endif
+
+       addr = mcfg->memzone[idx].addr;
+
        if (addr == NULL)
                ret = -EINVAL;
        else if (mcfg->memzone_cnt == 0) {
@@ -345,6 +349,10 @@ rte_memzone_free(const struct rte_memzone *mz)
        rte_free(addr);

        return ret;
+
+error:
+       rte_rwlock_write_unlock(&mcfg->mlock);
+       return ret;
 }

 /*
-- 
1.9.1

Reply via email to