From mboxrd@z Thu Jan 1 00:00:00 1970 From: Maxime Coquelin Subject: Re: [PATCH v2] lib/efd: fix to free tail queue entry after use Date: Fri, 23 Nov 2018 14:30:08 +0100 Message-ID: References: <1542109533-14283-1-git-send-email-hari.kumarx.vemula@intel.com> <1542194265-16156-1-git-send-email-hari.kumarx.vemula@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Cc: byron.marohn@intel.com, reshma.pattan@intel.com, pablo.de.lara.guarch@intel.com, stable@dpdk.org To: Hari Kumar Vemula , dev@dpdk.org Return-path: In-Reply-To: <1542194265-16156-1-git-send-email-hari.kumarx.vemula@intel.com> Content-Language: en-US List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On 11/14/18 12:17 PM, Hari Kumar Vemula wrote: > In rte_efd_create() allocated memory for tail queue entry but > not freed. > Added freeing the tail queue entry. > > Fixes: 56b6ef874f80 ("efd: new Elastic Flow Distributor library") > Cc: stable@dpdk.org > > Signed-off-by: Hari Kumar Vemula > Acked-by: Reshma Pattan > > --- > v2: Updated commit message. > --- > > lib/librte_efd/rte_efd.c | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > diff --git a/lib/librte_efd/rte_efd.c b/lib/librte_efd/rte_efd.c > index a780e2fe8..f8c6c447f 100644 > --- a/lib/librte_efd/rte_efd.c > +++ b/lib/librte_efd/rte_efd.c > @@ -739,17 +739,38 @@ void > rte_efd_free(struct rte_efd_table *table) > { > uint8_t socket_id; > + struct rte_efd_list *efd_list = NULL; NULL init seems useless here. > + struct rte_tailq_entry *te; > > if (table == NULL) > return; > > + efd_list = RTE_TAILQ_CAST(rte_efd_tailq.head, rte_efd_list); > + > for (socket_id = 0; socket_id < RTE_MAX_NUMA_NODES; socket_id++) > rte_free(table->chunks[socket_id]); > > + rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK); > + > + /* find our tailq entry */ > + TAILQ_FOREACH(te, efd_list, next) { > + if (te->data == (void *) table) > + break; > + } > + > + if (te == NULL) { > + rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); > + return; > + } > + > + TAILQ_REMOVE(efd_list, te, next); > + rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); Wouldn't this be simpler by using TAILQ_FOREACH_SAFE() instead? The element could removed from the list and freed within the loop. > + > rte_ring_free(table->free_slots); > rte_free(table->offline_chunks); > rte_free(table->keys); > rte_free(table); > + rte_free(te); > } > > /** >