On 11/3/15, 11:49 AM, "users on behalf of ????????? ????????" <users-bounces at 
dpdk.org on behalf of cidjey1991 at mail.ru> wrote:

> Hi all. I'm sorry if the question is naive or stupid, but still I couldn't 
> find the answer in the manual.

The only naive or stupid question is one you do not ask or so goes the 
statement :-)

>
>The question is: are the element init functions called just once (with the 
>mempool creation) or are they called each time we retrieve a new element from 
>a pool? I'm asking because I use a mempool pool with pkt_mbuf structures for 
>generating new Ethernet frames (with IP and TCP data) and it works just fine 
>for a while (I reckon just as long as I'm getting a new pktmbuf with 
>rte_pktmbuf_alloc and not a recycled one) and at some point my generated 
>frames start to have the wrong TCP ckecksum (even though TCP checksum it 
>totally OK at first). And the strange thing is that if, for instance, mempool 
>has 2048 elements -  my program works for 5 seconds (rough estimate), and if 
>mempool has 4096 elements - my program works for 10 seconds. The connection is 
>obvious. I used to believe that init() functions are called each time we 
>retrieve an element from a mempool, but now I'm not so sure.

When you call rte_pktmbuf_pool_create() it passes rte_pktmbuf_pool_init and 
rte_pktmbuf_init to the rte_mempool_create() routine. The 
rte_pktmbuf_pool_init() is called once for the pool and the rte_pktmbuf_init() 
is called for each mbuf it creates from the pool at create time only.

On rte_pktbuf_alloc() it will calls __rte_mbuf_raw_alloc() and then 
rte_pktmbuf_reset() to reset the mbuf into a sane state. If you are trying to 
save mbuf state across frees then it will not work and you have to find another 
way. For Pktgen I wanted to keep the mbufs intact across frees and it is not 
super easy and you can look in Pktgen code, but I would suggest it only if 
really required.

I hope that helps.

>
>
>Alex Samoylov


Regards,
Keith




Reply via email to