On Fri, Oct 02, 2015 at 03:01:25PM +0100, Pablo de Lara wrote: > From: "Pablo de Lara" <pablo.de.lara.guarch at intel.com> > > When creating a ring, a memzone is created to allocate it in memory, > but the ring could not be freed, as memzones could not be. > > Since memzones can be freed now, then rings can be as well, > taking into account if they were initialized using pre-allocated memory > (in which case, memory should be freed externally) or using > rte_memzone_reserve > (with rte_ring_create), freeing the memory with rte_memzone_free. > > Signed-off-by: Pablo de Lara <pablo.de.lara.guarch at intel.com> > --- > Changes in v3: > - Simplify patch using stored memzone address in ring structure > - Change copyright date
I think you need to call out that this patch depends upon http://dpdk.org/dev/patchwork/patch/7308/ > > Changes in v2: > - Include note in release notes > - Add error log when ring cannot be freed > > This patch depends on patch "rte_ring: store memzone pointer inside ring" > > doc/guides/rel_notes/release_2_2.rst | 4 +++ > lib/librte_ring/rte_ring.c | 47 > +++++++++++++++++++++++++++++++++++- > lib/librte_ring/rte_ring.h | 7 ++++++ > lib/librte_ring/rte_ring_version.map | 7 ++++++ > 4 files changed, 64 insertions(+), 1 deletion(-) > > diff --git a/doc/guides/rel_notes/release_2_2.rst > b/doc/guides/rel_notes/release_2_2.rst > index 5687676..24937ac 100644 > --- a/doc/guides/rel_notes/release_2_2.rst > +++ b/doc/guides/rel_notes/release_2_2.rst > @@ -4,6 +4,10 @@ DPDK Release 2.2 > New Features > ------------ > > +* **Enabled freeing of rte_ring.** > + > + New function rte_ring_free() allows the user to free a ring > + if it was created with rte_ring_create(). > > Resolved Issues > --------------- > diff --git a/lib/librte_ring/rte_ring.c b/lib/librte_ring/rte_ring.c > index 4e78e14..d80faf3 100644 > --- a/lib/librte_ring/rte_ring.c > +++ b/lib/librte_ring/rte_ring.c > @@ -1,7 +1,7 @@ > /*- > * BSD LICENSE > * > - * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. > + * Copyright(c) 2010-2015 Intel Corporation. All rights reserved. > * All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > @@ -209,6 +209,51 @@ rte_ring_create(const char *name, unsigned count, int > socket_id, > return r; > } > > +/* free the ring */ > +void > +rte_ring_free(struct rte_ring *r) > +{ > + struct rte_ring_list *ring_list = NULL; > + struct rte_tailq_entry *te; > + > + if (r == NULL) > + return; > + > + /* > + * Ring was not created with rte_ring_create, > + * therefore, there is no memzone to free. > + */ > + if (r->memzone == NULL) { > + RTE_LOG(ERR, RING, "Cannot free ring (not created with > rte_ring_create()"); > + return; > + } > + > + if (rte_memzone_free(r->memzone) != 0) { > + RTE_LOG(ERR, RING, "Cannot free memory\n"); > + return; > + } > + > + ring_list = RTE_TAILQ_CAST(rte_ring_tailq.head, rte_ring_list); > + rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK); > + > + /* find out tailq entry */ > + TAILQ_FOREACH(te, ring_list, next) { > + if (te->data == (void *) r) > + break; > + } > + > + if (te == NULL) { > + rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); > + return; > + } > + > + TAILQ_REMOVE(ring_list, te, next); > + > + rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); > + > + rte_free(te); > +} > + > /* > * change the high water mark. If *count* is 0, water marking is > * disabled > diff --git a/lib/librte_ring/rte_ring.h b/lib/librte_ring/rte_ring.h > index df45f3f..fb5a626 100644 > --- a/lib/librte_ring/rte_ring.h > +++ b/lib/librte_ring/rte_ring.h > @@ -304,6 +304,13 @@ int rte_ring_init(struct rte_ring *r, const char *name, > unsigned count, > */ > struct rte_ring *rte_ring_create(const char *name, unsigned count, > int socket_id, unsigned flags); > +/** > + * De-allocate all memory used by the ring. > + * > + * @param r > + * Ring to free > + */ > +void rte_ring_free(struct rte_ring *r); > > /** > * Change the high water mark. > diff --git a/lib/librte_ring/rte_ring_version.map > b/lib/librte_ring/rte_ring_version.map > index 982fdd1..5474b98 100644 > --- a/lib/librte_ring/rte_ring_version.map > +++ b/lib/librte_ring/rte_ring_version.map > @@ -11,3 +11,10 @@ DPDK_2.0 { > > local: *; > }; > + > +DPDK_2.2 { > + global: > + > + rte_ring_free; > + > +} DPDK_2.0; > -- > 2.4.3 >