Hi Shreyansh, On 6/6/2016 3:38 PM, Shreyansh Jain wrote: > Hi, > > (Apologies for overly-eager email sent on this thread earlier. Will be more > careful in future). > > This is more of a question/clarification than a comment. (And I have taken > only some snippets from original mail to keep it cleaner) > > <snip> >> +MEMPOOL_REGISTER_OPS(ops_mp_mc); >> +MEMPOOL_REGISTER_OPS(ops_sp_sc); >> +MEMPOOL_REGISTER_OPS(ops_mp_sc); >> +MEMPOOL_REGISTER_OPS(ops_sp_mc); > <snip> > > From the above what I understand is that multiple packet pool handlers can > be created. > > I have a use-case where application has multiple pools but only the packet > pool is hardware backed. Using the hardware for general buffer requirements > would prove costly. > From what I understand from the patch, selection of the pool is based on the > flags below.
The flags are only used to select one of the default handlers for backward compatibility through the rte_mempool_create call. If you wish to use a mempool handler that is not one of the defaults, (i.e. a new hardware handler), you would use the rte_create_mempool_empty followed by the rte_mempool_set_ops_byname call. So, for the external handlers, you create and empty mempool, then set the operations (ops) for that particular mempool. > <snip> >> + /* >> + * Since we have 4 combinations of the SP/SC/MP/MC examine the flags to >> + * set the correct index into the table of ops structs. >> + */ >> + if (flags & (MEMPOOL_F_SP_PUT | MEMPOOL_F_SC_GET)) >> + rte_mempool_set_ops_byname(mp, "ring_sp_sc"); >> + else if (flags & MEMPOOL_F_SP_PUT) >> + rte_mempool_set_ops_byname(mp, "ring_sp_mc"); >> + else if (flags & MEMPOOL_F_SC_GET) >> + rte_mempool_set_ops_byname(mp, "ring_mp_sc"); >> + else >> + rte_mempool_set_ops_byname(mp, "ring_mp_mc"); >> + > Is there any way I can achieve the above use case of multiple pools which can > be selected by an application - something like a run-time toggle/flag? > > - > Shreyansh Yes, you can create multiple pools, some using the default handlers, and some using external handlers. There is an example of this in the autotests (app/test/test_mempool.c). This test creates multiple mempools, of which one is a custom malloc based mempool handler. The test puts and gets mbufs to/from each mempool all in the same application. Regards, Dave.