From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com [62.23.145.76]) by dpdk.org (Postfix) with ESMTP id 00A8DC166 for ; Tue, 16 Feb 2016 15:40:31 +0100 (CET) Received: from glumotte.dev.6wind.com (unknown [10.16.0.195]) by proxy.6wind.com (Postfix) with ESMTP id A14A128EB5 for ; Tue, 16 Feb 2016 15:39:47 +0100 (CET) From: Olivier Matz To: dev@dpdk.org Date: Tue, 16 Feb 2016 15:40:10 +0100 Message-Id: <1455633610-5179-1-git-send-email-olivier.matz@6wind.com> X-Mailer: git-send-email 2.1.4 Subject: [dpdk-dev] [PATCH] mempool: fix leak when mempool creation fails X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 16 Feb 2016 14:40:31 -0000 Since commits ff909fe21f and 4e32101f9b, it is now possible to free memzones and rings. The rte_mempool_create() should be modified to take advantage of this and not leak memory when an allocation fails. Signed-off-by: Olivier Matz --- lib/librte_mempool/rte_mempool.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c index aff5f6d..f8781e1 100644 --- a/lib/librte_mempool/rte_mempool.c +++ b/lib/librte_mempool/rte_mempool.c @@ -438,8 +438,8 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size, char rg_name[RTE_RING_NAMESIZE]; struct rte_mempool_list *mempool_list; struct rte_mempool *mp = NULL; - struct rte_tailq_entry *te; - struct rte_ring *r; + struct rte_tailq_entry *te = NULL; + struct rte_ring *r = NULL; const struct rte_memzone *mz; size_t mempool_size; int mz_flags = RTE_MEMZONE_1GB|RTE_MEMZONE_SIZE_HINT_ONLY; @@ -511,7 +511,7 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size, snprintf(rg_name, sizeof(rg_name), RTE_MEMPOOL_MZ_FORMAT, name); r = rte_ring_create(rg_name, rte_align32pow2(n+1), socket_id, rg_flags); if (r == NULL) - goto exit; + goto exit_unlock; /* * reserve a memory zone for this mempool: private data is @@ -536,7 +536,7 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size, te = rte_zmalloc("MEMPOOL_TAILQ_ENTRY", sizeof(*te), 0); if (te == NULL) { RTE_LOG(ERR, MEMPOOL, "Cannot allocate tailq entry!\n"); - goto exit; + goto exit_unlock; } /* @@ -561,15 +561,8 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size, snprintf(mz_name, sizeof(mz_name), RTE_MEMPOOL_MZ_FORMAT, name); mz = rte_memzone_reserve(mz_name, mempool_size, socket_id, mz_flags); - - /* - * no more memory: in this case we loose previously reserved - * space for the ring as we cannot free it - */ - if (mz == NULL) { - rte_free(te); - goto exit; - } + if (mz == NULL) + goto exit_unlock; if (rte_eal_has_hugepages()) { startaddr = (void*)mz->addr; @@ -633,11 +626,16 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size, rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK); TAILQ_INSERT_TAIL(mempool_list, te, next); rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); - -exit: rte_rwlock_write_unlock(RTE_EAL_MEMPOOL_RWLOCK); return mp; + +exit_unlock: + rte_rwlock_write_unlock(RTE_EAL_MEMPOOL_RWLOCK); + rte_ring_free(r); + rte_free(te); + + return NULL; } /* Return the number of entries in the mempool */ -- 2.1.4