[dpdk-dev] [PATCH] kni: use bulk functions to allocate and free mbufs

Ananyev, Konstantin konstantin.ananyev at intel.com
Wed Jan 11 18:43:17 CET 2017



> -----Original Message-----
> From: Stephen Hemminger [mailto:stephen at networkplumber.org]
> Sent: Wednesday, January 11, 2017 5:36 PM
> To: Ananyev, Konstantin <konstantin.ananyev at intel.com>
> Cc: Sergey Vyazmitinov <s.vyazmitinov at brain4net.com>; olivier.matz at 6wind.com; Yigit, Ferruh <ferruh.yigit at intel.com>; dev at dpdk.org
> Subject: Re: [dpdk-dev] [PATCH] kni: use bulk functions to allocate and free mbufs
> 
> On Wed, 11 Jan 2017 17:28:21 +0000
> "Ananyev, Konstantin" <konstantin.ananyev at intel.com> wrote:
> 
> > > -----Original Message-----
> > > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Stephen Hemminger
> > > Sent: Wednesday, January 11, 2017 4:18 PM
> > > To: Sergey Vyazmitinov <s.vyazmitinov at brain4net.com>
> > > Cc: olivier.matz at 6wind.com; Yigit, Ferruh <ferruh.yigit at intel.com>; dev at dpdk.org
> > > Subject: Re: [dpdk-dev] [PATCH] kni: use bulk functions to allocate and free mbufs
> > >
> > > On Fri, 30 Dec 2016 04:50:16 +0700
> > > Sergey Vyazmitinov <s.vyazmitinov at 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.
> >
> > I suppose both stituations are possible:
> > 1) user knows off-hand that all mbufs in the group are from the same mempool
> > 2) user can't guarantee that all mbufs in the group are from same mempool.
> >
> > As I understand that patch is for case 1) only.
> > For 2) it could be a separate function and separate patch.
> >
> > Konstantin
> >
> >
> 
> Please don't make unnecessary assumptions in pursuit of minor optimizations.

I don't suggest to make *any* assumptions.
What I am saying we  can have 2 functions for two different cases.
Obviously we'll have to document it properly.
Konstantin

> It is trivial to write a correct free bulk that handles pool changing.
> Also the free_seg could be bulked as well.


More information about the dev mailing list