mem: fix freeing of memzone used by ivshmem
authorMauricio Vasquez B <mauricio.vasquezbernal@studenti.polito.it>
Fri, 15 Apr 2016 08:29:49 +0000 (10:29 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Mon, 2 May 2016 10:37:48 +0000 (12:37 +0200)
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@studenti.polito.it>
Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
lib/librte_eal/common/eal_common_memzone.c

index 711c845..a8f804c 100644 (file)
@@ -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)
-               ret = -EINVAL;
+       if (mcfg->memzone[idx].ioremap_addr != 0) {
+               rte_rwlock_write_unlock(&mcfg->mlock);
+               return -EINVAL;
+       }
 #endif
+
+       addr = mcfg->memzone[idx].addr;
+
        if (addr == NULL)
                ret = -EINVAL;
        else if (mcfg->memzone_cnt == 0) {