Hi Sergey, On 1/11/2017 4:17 PM, Stephen Hemminger wrote: > On Fri, 30 Dec 2016 04:50:16 +0700 > Sergey Vyazmitinov <s.vyazmiti...@brain4net.com> wrote: > >> /** >> + * Free n packets mbuf back into its original mempool. >> + * >> + * Free each mbuf, and all its segments in case of chained buffers. Each >> + * segment is added back into its original mempool. >> + * >> + * @param mp >> + * The packets mempool. >> + * @param mbufs >> + * The packets mbufs array to be freed. >> + * @param n >> + * Number of packets. >> + */ >> +static inline void rte_pktmbuf_free_bulk(struct rte_mempool *mp, >> + struct rte_mbuf **mbufs, unsigned n) >> +{ >> + struct rte_mbuf *mbuf, *m_next; >> + unsigned i; >> + for (i = 0; i < n; ++i) { >> + mbuf = mbufs[i]; >> + __rte_mbuf_sanity_check(mbuf, 1); >> + >> + mbuf = mbuf->next; >> + while (mbuf != NULL) { >> + m_next = mbuf->next; >> + rte_pktmbuf_free_seg(mbuf); >> + mbuf = m_next; >> + } >> + } >> + rte_mempool_put_bulk(mp, (void * const *)mbufs, n); >> +} > > The mbufs may come from different pools. You need to handle that. >
As Stephen pointed mbufs can be from different mempools. But still can benefit from bulk allocation part of your patch, would you mind separating patches for alloc and free? Thanks, ferruh