DPDK usage discussions
 help / color / Atom feed
* [dpdk-users] Segfault while freeing mbuf in the primary process
@ 2020-10-23 14:38 Farbod
  2020-10-24 14:24 ` Farbod
  0 siblings, 1 reply; 2+ messages in thread
From: Farbod @ 2020-10-23 14:38 UTC (permalink / raw)
  To: users

Hi,

I am using DPDK multi-processor mode for sending packets from one 
application (secondary) to another application (primary) using rings.
The primary applications role is to just free the packet with 
`rte_pktmbuf_free()`.

I encounter a SEGFAULT error in the line of `rte_pktmbuf_free()`.

My DPDK version is 19.11.1.

```

Signal: 11 (Segmentation fault), si_code: 1 (SEGV_MAPERR: address not 
mapped to object)
Backtrace (recent calls first) ---
(0): (+0x81a1ee) [0x562d35df51ee]
     bucket_enqueue_single at 
---/dpdk-19.11.1/drivers/mempool/bucket/rte_mempool_bucket.c:111 
(discriminator 3)
          108:   addr &= bd->bucket_page_mask;
          109:   hdr = (struct bucket_header *)addr;
110:
       -> 111:   if (likely(hdr->lcore_id == lcore_id)) {
          112:           if (hdr->fill_cnt < bd->obj_per_bucket - 1) {
          113: hdr->fill_cnt++;
          114:           } else {
      (inlined by) bucket_enqueue at 
---/dpdk-19.11.1/drivers/mempool/bucket/rte_mempool_bucket.c:148 
(discriminator 3)
          145:   int rc = 0;
146:
          147:   for (i = 0; i < n; i++) {
       -> 148:           rc = bucket_enqueue_single(bd, obj_table[i]);
          149:           RTE_ASSERT(rc == 0);
          150: }
[0x562d35cd2f8c]
     rte_mempool_ops_enqueue_bulk at 
---/dpdk-19.11.1/build/include/rte_mempool.h:786
       -> 786:   return ops->enqueue(mp, obj_table, n);
      (inlined by) __mempool_generic_put at 
---/dpdk-19.11.1/build/include/rte_mempool.h:1329
       -> 1329:          rte_mempool_ops_enqueue_bulk(mp, 
&cache->objs[cache->size],
      (inlined by) rte_mempool_generic_put at 
---/dpdk-19.11.1/build/include/rte_mempool.h:1365
       -> 1365:  __mempool_generic_put(mp, obj_table, n, cache);
      (inlined by) rte_mempool_put_bulk at 
---/dpdk-19.11.1/build/include/rte_mempool.h:1388
       -> 1388:  rte_mempool_generic_put(mp, obj_table, n, cache);
      (inlined by) rte_mempool_put at 
---/dpdk-19.11.1/build/include/rte_mempool.h:1406
       -> 1406:  rte_mempool_put_bulk(mp, &obj, 1);
      (inlined by) rte_mbuf_raw_free at 
---/dpdk-19.11.1/build/include/rte_mbuf.h:579
       -> 579:   rte_mempool_put(m->pool, m);
      (inlined by) rte_pktmbuf_free_seg at 
---/dpdk-19.11.1/build/include/rte_mbuf.h:1223
       -> 1223:          rte_mbuf_raw_free(m);         151:   if 
(local_stack->top > bd->bucket_stack_thresh) {
        (inlined by) rte_pktmbuf_free at ---/rte_mbuf.h:1244
       -> 1244: rte_pktmbuf_free_seg(m);
      (inlined by) ?? at --- /packet.h:199
       -> 199:     rte_pktmbuf_free(reinterpret_cast<struct rte_mbuf 
*>(pkt));

```

I have made sure that primary and secondary process does not share any 
cpu in common. The packets received in the primary application are valid 
and the information inside them is readable. It only runs in to SEGFAULT 
when I am trying to free the mubf structures.

I would like to mention that the applications are in two different 
projects and are built separately.

Thank you


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [dpdk-users] Segfault while freeing mbuf in the primary process
  2020-10-23 14:38 [dpdk-users] Segfault while freeing mbuf in the primary process Farbod
@ 2020-10-24 14:24 ` Farbod
  0 siblings, 0 replies; 2+ messages in thread
From: Farbod @ 2020-10-24 14:24 UTC (permalink / raw)
  To: users

Hi,

Regarding to the SEGFAULT question I asked yesterday, while I was 
searching on the internet I stumbled upon an email sent on DPDK user 
list which explained the solution to a similar problem. (Link to the 
email: 
https://inbox.dpdk.org/users/8AC28827-5B04-4392-AFB3-AD259DFBECA9@fireeye.com/t/#m3f14d7e92c0a0b3c530717632ca5047420083112 
)

As Andrew Rybchenko mentioned in the  email, the way two applications 
are built can result in issues with mempool operations. I do not 
understand how the mempool handlers work and how the order of shared 
libraries affect the DPDK system but I can confirm that by changing one 
of the applications' Makefile I could get through this problem and thing 
are working properly now.

It looks like there is a note on DPDK guide about this subject. (Link to 
DPDK guide: https://doc.dpdk.org/guides/prog_guide/mempool_lib.html )
excerpt from DPDK guide:
```

When running a multi-process application with shared libraries, the -d 
arguments for mempool handlers /must be specified in the same order for 
all processes/ to ensure correct operation.

```

I am not using `-d` while I am running my applications maybe I should. I 
just wanted to share my findings with you and thank you all for creating 
such a community.

Thank you
~ Farbod


On 10/23/20 6:08 PM, Farbod wrote:
> Hi,
>
> I am using DPDK multi-processor mode for sending packets from one 
> application (secondary) to another application (primary) using rings.
> The primary applications role is to just free the packet with 
> `rte_pktmbuf_free()`.
>
> I encounter a SEGFAULT error in the line of `rte_pktmbuf_free()`.
>
> My DPDK version is 19.11.1.
>
> ```
>
> Signal: 11 (Segmentation fault), si_code: 1 (SEGV_MAPERR: address not 
> mapped to object)
> Backtrace (recent calls first) ---
> (0): (+0x81a1ee) [0x562d35df51ee]
>     bucket_enqueue_single at 
> ---/dpdk-19.11.1/drivers/mempool/bucket/rte_mempool_bucket.c:111 
> (discriminator 3)
>          108:   addr &= bd->bucket_page_mask;
>          109:   hdr = (struct bucket_header *)addr;
> 110:
>       -> 111:   if (likely(hdr->lcore_id == lcore_id)) {
>          112:           if (hdr->fill_cnt < bd->obj_per_bucket - 1) {
>          113: hdr->fill_cnt++;
>          114:           } else {
>      (inlined by) bucket_enqueue at 
> ---/dpdk-19.11.1/drivers/mempool/bucket/rte_mempool_bucket.c:148 
> (discriminator 3)
>          145:   int rc = 0;
> 146:
>          147:   for (i = 0; i < n; i++) {
>       -> 148:           rc = bucket_enqueue_single(bd, obj_table[i]);
>          149:           RTE_ASSERT(rc == 0);
>          150: }
> [0x562d35cd2f8c]
>     rte_mempool_ops_enqueue_bulk at 
> ---/dpdk-19.11.1/build/include/rte_mempool.h:786
>       -> 786:   return ops->enqueue(mp, obj_table, n);
>      (inlined by) __mempool_generic_put at 
> ---/dpdk-19.11.1/build/include/rte_mempool.h:1329
>       -> 1329:          rte_mempool_ops_enqueue_bulk(mp, 
> &cache->objs[cache->size],
>      (inlined by) rte_mempool_generic_put at 
> ---/dpdk-19.11.1/build/include/rte_mempool.h:1365
>       -> 1365:  __mempool_generic_put(mp, obj_table, n, cache);
>      (inlined by) rte_mempool_put_bulk at 
> ---/dpdk-19.11.1/build/include/rte_mempool.h:1388
>       -> 1388:  rte_mempool_generic_put(mp, obj_table, n, cache);
>      (inlined by) rte_mempool_put at 
> ---/dpdk-19.11.1/build/include/rte_mempool.h:1406
>       -> 1406:  rte_mempool_put_bulk(mp, &obj, 1);
>      (inlined by) rte_mbuf_raw_free at 
> ---/dpdk-19.11.1/build/include/rte_mbuf.h:579
>       -> 579:   rte_mempool_put(m->pool, m);
>      (inlined by) rte_pktmbuf_free_seg at 
> ---/dpdk-19.11.1/build/include/rte_mbuf.h:1223
>       -> 1223:          rte_mbuf_raw_free(m);         151:   if 
> (local_stack->top > bd->bucket_stack_thresh) {
>        (inlined by) rte_pktmbuf_free at ---/rte_mbuf.h:1244
>       -> 1244: rte_pktmbuf_free_seg(m);
>      (inlined by) ?? at --- /packet.h:199
>       -> 199:     rte_pktmbuf_free(reinterpret_cast<struct rte_mbuf 
> *>(pkt));
>
> ```
>
> I have made sure that primary and secondary process does not share any 
> cpu in common. The packets received in the primary application are 
> valid and the information inside them is readable. It only runs in to 
> SEGFAULT when I am trying to free the mubf structures.
>
> I would like to mention that the applications are in two different 
> projects and are built separately.
>
> Thank you
>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, back to index

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-23 14:38 [dpdk-users] Segfault while freeing mbuf in the primary process Farbod
2020-10-24 14:24 ` Farbod

DPDK usage discussions

Archives are clonable:
	git clone --mirror http://inbox.dpdk.org/users/0 users/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 users users/ http://inbox.dpdk.org/users \
		users@dpdk.org
	public-inbox-index users


Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.users


AGPL code for this site: git clone https://public-inbox.org/ public-inbox