From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.windriver.com (mail.windriver.com [147.11.1.11]) by dpdk.org (Postfix) with ESMTP id D169D7E2C for ; Mon, 6 Oct 2014 16:43:31 +0200 (CEST) Received: from ALA-HCB.corp.ad.wrs.com (ala-hcb.corp.ad.wrs.com [147.11.189.41]) by mail.windriver.com (8.14.9/8.14.5) with ESMTP id s96EodhQ016614 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=FAIL) for ; Mon, 6 Oct 2014 07:50:39 -0700 (PDT) Received: from ALA-MBB.corp.ad.wrs.com ([169.254.1.18]) by ALA-HCB.corp.ad.wrs.com ([147.11.189.41]) with mapi id 14.03.0174.001; Mon, 6 Oct 2014 07:50:38 -0700 From: "Wiles, Roger Keith" To: "RICHARDSON, BRUCE" Thread-Topic: [dpdk-dev] [PATCH 2/2] Adding the routines rte_pktmbuf_alloc_bulk() and rte_pktmbuf_free_bulk() Thread-Index: AQHP4UOohbitp8XoLEu9K6u9lPldRZwjnJoA Date: Mon, 6 Oct 2014 14:50:38 +0000 Message-ID: <5DD5FF6E-C045-4764-A5B1-877C88B023F5@windriver.com> References: <1412464229-125521-1-git-send-email-keith.wiles@windriver.com> <1412464229-125521-2-git-send-email-keith.wiles@windriver.com> <59AF69C657FD0841A61C55336867B5B03441BE9E@IRSMSX103.ger.corp.intel.com> In-Reply-To: <59AF69C657FD0841A61C55336867B5B03441BE9E@IRSMSX103.ger.corp.intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [172.25.40.166] Content-Type: text/plain; charset="us-ascii" Content-ID: <42C35AA210744A4CA3221C59AC300A37@local> Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Cc: "dev@dpdk.org" Subject: Re: [dpdk-dev] [PATCH 2/2] Adding the routines rte_pktmbuf_alloc_bulk() and rte_pktmbuf_free_bulk() 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: Mon, 06 Oct 2014 14:43:32 -0000 Hi Bruce, Do I need to reject the for the new routines or just make sure the vector d= river does not get updated to use those routines? Thanks ++Keith On Oct 6, 2014, at 3:56 AM, Richardson, Bruce = wrote: >=20 >=20 >> -----Original Message----- >> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Keith Wiles >> Sent: Sunday, October 05, 2014 12:10 AM >> To: dev@dpdk.org >> Subject: [dpdk-dev] [PATCH 2/2] Adding the routines rte_pktmbuf_alloc_bu= lk() >> and rte_pktmbuf_free_bulk() >>=20 >> Minor helper routines to mirror the mempool routines and remove the code >> from applications. The ixgbe_rxtx_vec.c routine could be changed to use >> the ret_pktmbuf_alloc_bulk() routine inplace of rte_mempool_get_bulk(). >>=20 >=20 > I believe such a change would cause a performance regression, as the extr= a init code in the alloc_bulk() function would take additional cycles and i= s not needed. The vector routines use the mempool function directly, so tha= t there is no overhead of mbuf initialization, as the vector routines use t= heir additional "knowledge" of what the mbufs will be used for to init them= in a faster manner than can be done inside the mbuf library. >=20 > /Bruce >=20 >> Signed-off-by: Keith Wiles >> --- >> lib/librte_mbuf/rte_mbuf.h | 77 >> ++++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 77 insertions(+) >>=20 >> diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h >> index 1c6e115..f298621 100644 >> --- a/lib/librte_mbuf/rte_mbuf.h >> +++ b/lib/librte_mbuf/rte_mbuf.h >> @@ -546,6 +546,41 @@ static inline void rte_pktmbuf_reset(struct rte_mbu= f >> *m) >> } >>=20 >> /** >> + * @internal Allocate a list of mbufs from mempool *mp*. >> + * The use of that function is reserved for RTE internal needs. >> + * Please use rte_pktmbuf_alloc_bulk(). >> + * >> + * @param mp >> + * The mempool from which mbuf is allocated. >> + * @param m_list >> + * The array to place the allocated rte_mbufs pointers. >> + * @param cnt >> + * The number of mbufs to allocate >> + * @return >> + * - 0 if the number of mbufs allocated was ok >> + * - <0 is an ERROR. >> + */ >> +static inline int __rte_mbuf_raw_alloc_bulk(struct rte_mempool *mp, str= uct >> rte_mbuf *m_list[], int cnt) >> +{ >> + struct rte_mbuf *m; >> + int ret; >> + >> + ret =3D rte_mempool_get_bulk(mp, (void **)m_list, cnt); >> + if ( ret =3D=3D 0 ) { >> + int i; >> + for(i =3D 0; i < cnt; i++) { >> + m =3D *m_list++; >> +#ifdef RTE_MBUF_REFCNT >> + rte_mbuf_refcnt_set(m, 1); >> +#endif /* RTE_MBUF_REFCNT */ >> + rte_pktmbuf_reset(m); >> + } >> + ret =3D cnt; >> + } >> + return ret; >> +} >> + >> +/** >> * Allocate a new mbuf from a mempool. >> * >> * This new mbuf contains one segment, which has a length of 0. The poin= ter >> @@ -671,6 +706,32 @@ __rte_pktmbuf_prefree_seg(struct rte_mbuf *m) >> } >>=20 >> /** >> + * Allocate a list of mbufs from a mempool into a mbufs array. >> + * >> + * This mbuf list contains one segment per mbuf, which has a length of = 0. The >> pointer >> + * to data is initialized to have some bytes of headroom in the buffer >> + * (if buffer size allows). >> + * >> + * The routine is just a simple wrapper routine to reduce code in the a= pplication >> and >> + * provide a cleaner API for multiple mbuf requests. >> + * >> + * @param mp >> + * The mempool from which the mbuf is allocated. >> + * @param m_list >> + * An array of mbuf pointers, cnt must be less then or equal to the s= ize of the >> list. >> + * @param cnt >> + * Number of slots in the m_list array to fill. >> + * @return >> + * - The number of valid mbufs pointers in the m_list array. >> + * - Zero if the request cnt could not be allocated. >> + */ >> +static inline int __attribute__((always_inline)) >> +rte_pktmbuf_alloc_bulk(struct rte_mempool *mp, struct rte_mbuf *m_list[= ], >> int16_t cnt) >> +{ >> + return __rte_mbuf_raw_alloc_bulk(mp, m_list, cnt); >> +} >> + >> +/** >> * Free a segment of a packet mbuf into its original mempool. >> * >> * Free an mbuf, without parsing other segments in case of chained >> @@ -708,6 +769,22 @@ static inline void rte_pktmbuf_free(struct rte_mbuf >> *m) >> } >> } >>=20 >> +/** >> + * Free a list of packet mbufs back into its original mempool. >> + * >> + * Free a list of mbufs by calling rte_pktmbuf_free() in a loop as a wr= apper >> function. >> + * >> + * @param m_list >> + * An array of rte_mbuf pointers to be freed. >> + * @param npkts >> + * Number of packets to free in list. >> + */ >> +static inline void rte_pktmbuf_free_bulk(struct rte_mbuf *m_list[], int= 16_t >> npkts) >> +{ >> + while(npkts--) >> + rte_pktmbuf_free(*m_list++); >> +} >> + >> #ifdef RTE_MBUF_REFCNT >>=20 >> /** >> -- >> 2.1.0 >=20 Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-= 213-5533