[dpdk-users] How rte_mempool_ops_table is populated in a DPDK client application?
stephen at networkplumber.org
Fri Sep 1 22:47:24 CEST 2017
On Fri, 1 Sep 2017 20:26:48 +0000
Ming Fu <Ming.Fu at esentire.com> wrote:
> Did some digging and find that the rte_mempool_ops_table is populated from function rte_mempool_register_ops().
> From a small program build in the dpdk example, the rte_mempool_register_ops() is called from the following stack trace
> (gdb) where
> #0 0x000000000047eea0 in rte_mempool_register_ops ()
> #1 0x00000000006a8abd in __libc_csu_init ()
> #2 0x00007ffff71f97bf in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
> #3 0x0000000000440f29 in _start ()
> So this function is called probably before rte_eal_init(). If I have an application linked to a static lib of dpdk outside of dpdk build tree, how do I make it to register the call to rte_mempool_register_ops from __libc_csu_init()?
> From: Ming Fu
> Sent: September-01-17 9:36 AM
> To: users at dpdk.org
> Subject: How rte_mempool_ops_table is populated in a DPDK client application?
> Try to make snort to receive packet from a dpdk ring as an client application. The DPDK is compiled into the snort DAQ lib statically. The DAQ lib is then linked to snort statically.
> What I am find is that the rte_mempool_ops_table is all 0, causing the client to crash when free the received mbuf from the ring. I was wondering how this rte_mempool_ops_table is populated during DPDK initialization for a client application.
> The my dpdk snort went through rte_eal_init(), rte_ring_lookup() and rte_mempool_lookup() without error.
Make sure static initalizers are run in your program. If you use the DPDK mk rules, it works correctly.
If you use other build environments, you need to adjust the linker flags.
More information about the users