Adding dev@ mailing list and ring maintainers,

On Wed, Mar 15, 2023 at 8:13 PM Patrick Robb <pr...@iol.unh.edu> wrote:
>>
>> Would passing "-Ddebug=true" be better than changing the default buildtype?
>> It's possible to have a release build (i.e. O3 optimized) with debug info.
>
>
> Strangely, even with -Ddebug true if I'm running buildtype "release" it 
> returns the same warnings. I'm inferring from your comment that release 
> optimization == debugoptimized optimization and debug behavior from 
> -Ddebug=true == debug behavior from debugoptimized, so release buildtype + 
> debug "should" have the same behavior as just setting buildtype 
> debugoptimized, and yet...
>
> I'll have to look into this a little more. Hopefully by the end I'll be like 
> David and understand the relations between these flags better, hah.

As for how buildtype, optimizations and debug params are concerned,
the summary is here:
https://mesonbuild.com/Builtin-options.html#details-for-buildtype


In my tests this morning with a Alpine container, I noticed that
setting -Dplatform to native makes the issue disappear...
So an additional factor is building with platform=generic.

~/dpdk # meson configure build | awk '{if ($1 ~
/^(buildtype|platform|debug|optimization)$/) { print $0; }}'
  buildtype              debug               [plain, debug,
debugoptimized, release, minsize, custom]      Build type to use
  debug                  true                [true, false]
                                    Debug
  optimization           0                   [0, g, 1, 2, 3, s]
                                    Optimization level
  platform               generic
                                    Platform to build, either
"native", "generic" or a SoC. Please refer to the Linux build guide
for more information.

...

In file included from ../lib/ring/rte_ring_elem.h:24,
                 from ../lib/ring/rte_ring.h:43,
                 from ../lib/mempool/rte_mempool.h:47,
                 from ../lib/mbuf/rte_mbuf.h:38,
                 from ../lib/net/rte_ether.h:22,
                 from ../lib/ethdev/rte_eth_ctrl.h:10,
                 from ../lib/ethdev/rte_ethdev.h:1421,
                 from ../app/test/test_event_timer_adapter.c:14:
In function '__rte_ring_enqueue_elems_128',
    inlined from '__rte_ring_enqueue_elems' at
../lib/ring/rte_ring_elem_pvt.h:132:3,
    inlined from '__rte_ring_do_enqueue_elem' at
../lib/ring/rte_ring_elem_pvt.h:328:2,
    inlined from 'rte_ring_mp_enqueue_bulk_elem' at
../lib/ring/rte_ring_elem.h:134:9,
    inlined from 'rte_ring_enqueue_bulk_elem' at
../lib/ring/rte_ring_elem.h:199:10,
    inlined from 'rte_ring_enqueue_elem' at ../lib/ring/rte_ring_elem.h:290:9,
    inlined from 'rte_ring_enqueue' at ../lib/ring/rte_ring.h:339:9,
    inlined from '_cancel_producer' at
../app/test/test_event_timer_adapter.c:834:10:
../lib/ring/rte_ring_elem_pvt.h:100:25: error: 'memcpy' reading 32
bytes from a region of size 8 [-Werror=stringop-overread]
  100 |                         memcpy((void *)(ring + idx),
      |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
  101 |                                 (const void *)(obj + i), 32);
      |                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../app/test/test_event_timer_adapter.c: In function '_cancel_producer':
../app/test/test_event_timer_adapter.c:805:1: note: source object
'obj' of size 8
  805 | _cancel_producer(uint64_t timeout_tcks, uint64_t timers)
      | ^~~~~~~~~~~~~~~~
In function '__rte_ring_enqueue_elems_128',
    inlined from '__rte_ring_enqueue_elems' at
../lib/ring/rte_ring_elem_pvt.h:132:3,
    inlined from '__rte_ring_do_enqueue_elem' at
../lib/ring/rte_ring_elem_pvt.h:328:2,
    inlined from 'rte_ring_sp_enqueue_bulk_elem' at
../lib/ring/rte_ring_elem.h:163:9,
    inlined from 'rte_ring_enqueue_bulk_elem' at
../lib/ring/rte_ring_elem.h:202:10,
    inlined from 'rte_ring_enqueue_elem' at ../lib/ring/rte_ring_elem.h:290:9,
    inlined from 'rte_ring_enqueue' at ../lib/ring/rte_ring.h:339:9,
    inlined from '_cancel_producer' at
../app/test/test_event_timer_adapter.c:834:10:
../lib/ring/rte_ring_elem_pvt.h:100:25: error: 'memcpy' reading 32
bytes from a region of size 8 [-Werror=stringop-overread]
  100 |                         memcpy((void *)(ring + idx),
      |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
  101 |                                 (const void *)(obj + i), 32);
      |                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../app/test/test_event_timer_adapter.c: In function '_cancel_producer':
../app/test/test_event_timer_adapter.c:805:1: note: source object
'obj' of size 8
  805 | _cancel_producer(uint64_t timeout_tcks, uint64_t timers)
      | ^~~~~~~~~~~~~~~~
In function '__rte_ring_enqueue_elems_128',
    inlined from '__rte_ring_enqueue_elems' at
../lib/ring/rte_ring_elem_pvt.h:132:3,
    inlined from '__rte_ring_do_rts_enqueue_elem' at
../lib/ring/rte_ring_rts_elem_pvt.h:211:3,
    inlined from 'rte_ring_mp_rts_enqueue_bulk_elem' at
../lib/ring/rte_ring_rts.h:83:9,
    inlined from 'rte_ring_enqueue_bulk_elem' at
../lib/ring/rte_ring_elem.h:205:10,
    inlined from 'rte_ring_enqueue_elem' at ../lib/ring/rte_ring_elem.h:290:9,
    inlined from 'rte_ring_enqueue' at ../lib/ring/rte_ring.h:339:9,
    inlined from '_cancel_producer' at
../app/test/test_event_timer_adapter.c:834:10:
../lib/ring/rte_ring_elem_pvt.h:100:25: error: 'memcpy' reading 32
bytes from a region of size 8 [-Werror=stringop-overread]
  100 |                         memcpy((void *)(ring + idx),
      |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
  101 |                                 (const void *)(obj + i), 32);
      |                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../app/test/test_event_timer_adapter.c: In function '_cancel_producer':
../app/test/test_event_timer_adapter.c:805:1: note: source object
'obj' of size 8
  805 | _cancel_producer(uint64_t timeout_tcks, uint64_t timers)
      | ^~~~~~~~~~~~~~~~
In function '__rte_ring_enqueue_elems_128',
    inlined from '__rte_ring_enqueue_elems' at
../lib/ring/rte_ring_elem_pvt.h:132:3,
    inlined from '__rte_ring_do_hts_enqueue_elem' at
../lib/ring/rte_ring_hts_elem_pvt.h:196:3,
    inlined from 'rte_ring_mp_hts_enqueue_bulk_elem' at
../lib/ring/rte_ring_hts.h:56:9,
    inlined from 'rte_ring_enqueue_bulk_elem' at
../lib/ring/rte_ring_elem.h:208:10,
    inlined from 'rte_ring_enqueue_elem' at ../lib/ring/rte_ring_elem.h:290:9,
    inlined from 'rte_ring_enqueue' at ../lib/ring/rte_ring.h:339:9,
    inlined from '_cancel_producer' at
../app/test/test_event_timer_adapter.c:834:10:
../lib/ring/rte_ring_elem_pvt.h:100:25: error: 'memcpy' reading 32
bytes from a region of size 8 [-Werror=stringop-overread]
  100 |                         memcpy((void *)(ring + idx),
      |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
  101 |                                 (const void *)(obj + i), 32);
      |                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../app/test/test_event_timer_adapter.c: In function '_cancel_producer':
../app/test/test_event_timer_adapter.c:805:1: note: source object
'obj' of size 8
  805 | _cancel_producer(uint64_t timeout_tcks, uint64_t timers)
      | ^~~~~~~~~~~~~~~~
In function '__rte_ring_dequeue_elems_128',
    inlined from '__rte_ring_dequeue_elems' at
../lib/ring/rte_ring_elem_pvt.h:262:3,
    inlined from '__rte_ring_do_dequeue_elem' at
../lib/ring/rte_ring_elem_pvt.h:375:2,
    inlined from 'rte_ring_mc_dequeue_bulk_elem' at
../lib/ring/rte_ring_elem.h:320:9,
    inlined from 'rte_ring_dequeue_bulk_elem' at
../lib/ring/rte_ring_elem.h:381:10,
    inlined from 'rte_ring_dequeue_elem' at ../lib/ring/rte_ring_elem.h:475:9,
    inlined from 'rte_ring_dequeue' at ../lib/ring/rte_ring.h:477:9,
    inlined from '_cancel_thread' at
../app/test/test_event_timer_adapter.c:917:7:
../lib/ring/rte_ring_elem_pvt.h:234:25: error: 'memcpy' writing 32
bytes into a region of size 8 overflows the destination
[-Werror=stringop-overflow=]
  234 |                         memcpy((void *)(obj + i), (void
*)(ring + idx), 32);
      |
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../app/test/test_event_timer_adapter.c: In function '_cancel_thread':
../app/test/test_event_timer_adapter.c:913:33: note: destination
object 'ev_tim' of size 8
  913 |         struct rte_event_timer *ev_tim = NULL;
      |                                 ^~~~~~
In function '__rte_ring_dequeue_elems_128',
    inlined from '__rte_ring_dequeue_elems' at
../lib/ring/rte_ring_elem_pvt.h:262:3,
    inlined from '__rte_ring_do_dequeue_elem' at
../lib/ring/rte_ring_elem_pvt.h:375:2,
    inlined from 'rte_ring_sc_dequeue_bulk_elem' at
../lib/ring/rte_ring_elem.h:348:9,
    inlined from 'rte_ring_dequeue_bulk_elem' at
../lib/ring/rte_ring_elem.h:384:10,
    inlined from 'rte_ring_dequeue_elem' at ../lib/ring/rte_ring_elem.h:475:9,
    inlined from 'rte_ring_dequeue' at ../lib/ring/rte_ring.h:477:9,
    inlined from '_cancel_thread' at
../app/test/test_event_timer_adapter.c:917:7:
../lib/ring/rte_ring_elem_pvt.h:234:25: error: 'memcpy' writing 32
bytes into a region of size 8 overflows the destination
[-Werror=stringop-overflow=]
  234 |                         memcpy((void *)(obj + i), (void
*)(ring + idx), 32);
      |
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../app/test/test_event_timer_adapter.c: In function '_cancel_thread':
../app/test/test_event_timer_adapter.c:913:33: note: destination
object 'ev_tim' of size 8
  913 |         struct rte_event_timer *ev_tim = NULL;
      |                                 ^~~~~~
In function '__rte_ring_dequeue_elems_128',
    inlined from '__rte_ring_dequeue_elems' at
../lib/ring/rte_ring_elem_pvt.h:262:3,
    inlined from '__rte_ring_do_rts_dequeue_elem' at
../lib/ring/rte_ring_rts_elem_pvt.h:252:3,
    inlined from 'rte_ring_mc_rts_dequeue_bulk_elem' at
../lib/ring/rte_ring_rts.h:110:9,
    inlined from 'rte_ring_dequeue_bulk_elem' at
../lib/ring/rte_ring_elem.h:387:10,
    inlined from 'rte_ring_dequeue_elem' at ../lib/ring/rte_ring_elem.h:475:9,
    inlined from 'rte_ring_dequeue' at ../lib/ring/rte_ring.h:477:9,
    inlined from '_cancel_thread' at
../app/test/test_event_timer_adapter.c:917:7:
../lib/ring/rte_ring_elem_pvt.h:234:25: error: 'memcpy' writing 32
bytes into a region of size 8 overflows the destination
[-Werror=stringop-overflow=]
  234 |                         memcpy((void *)(obj + i), (void
*)(ring + idx), 32);
      |
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../app/test/test_event_timer_adapter.c: In function '_cancel_thread':
../app/test/test_event_timer_adapter.c:913:33: note: destination
object 'ev_tim' of size 8
  913 |         struct rte_event_timer *ev_tim = NULL;
      |                                 ^~~~~~
In function '__rte_ring_dequeue_elems_128',
    inlined from '__rte_ring_dequeue_elems' at
../lib/ring/rte_ring_elem_pvt.h:262:3,
    inlined from '__rte_ring_do_hts_dequeue_elem' at
../lib/ring/rte_ring_hts_elem_pvt.h:237:3,
    inlined from 'rte_ring_mc_hts_dequeue_bulk_elem' at
../lib/ring/rte_ring_hts.h:83:9,
    inlined from 'rte_ring_dequeue_bulk_elem' at
../lib/ring/rte_ring_elem.h:390:10,
    inlined from 'rte_ring_dequeue_elem' at ../lib/ring/rte_ring_elem.h:475:9,
    inlined from 'rte_ring_dequeue' at ../lib/ring/rte_ring.h:477:9,
    inlined from '_cancel_thread' at
../app/test/test_event_timer_adapter.c:917:7:
../lib/ring/rte_ring_elem_pvt.h:234:25: error: 'memcpy' writing 32
bytes into a region of size 8 overflows the destination
[-Werror=stringop-overflow=]
  234 |                         memcpy((void *)(obj + i), (void
*)(ring + idx), 32);
      |
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../app/test/test_event_timer_adapter.c: In function '_cancel_thread':
../app/test/test_event_timer_adapter.c:913:33: note: destination
object 'ev_tim' of size 8
  913 |         struct rte_event_timer *ev_tim = NULL;
      |                                 ^~~~~~
cc1: all warnings being treated as errors
ninja: subcommands failed


This is gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924.

The compiler seems unhappy about the rte_int128_t type.
The below hunk seems to (confuse?) help the compiler.

diff --git a/lib/ring/rte_ring_elem_pvt.h b/lib/ring/rte_ring_elem_pvt.h
index 83788c56e6..ece937f8e1 100644
--- a/lib/ring/rte_ring_elem_pvt.h
+++ b/lib/ring/rte_ring_elem_pvt.h
@@ -98,7 +98,7 @@ __rte_ring_enqueue_elems_128(struct rte_ring *r,
uint32_t prod_head,
     if (likely(idx + n <= size)) {
         for (i = 0; i < (n & ~0x1); i += 2, idx += 2)
             memcpy((void *)(ring + idx),
-                (const void *)(obj + i), 32);
+                (const void *)((uintptr_t)obj + i), 32);
         switch (n & 0x1) {
         case 1:
             memcpy((void *)(ring + idx),
@@ -231,7 +231,7 @@ __rte_ring_dequeue_elems_128(struct rte_ring *r,
uint32_t prod_head,
     rte_int128_t *obj = (rte_int128_t *)obj_table;
     if (likely(idx + n <= size)) {
         for (i = 0; i < (n & ~0x1); i += 2, idx += 2)
-            memcpy((void *)(obj + i), (void *)(ring + idx), 32);
+            memcpy((void *)((uintptr_t)obj + i), (void *)(ring + idx), 32);
         switch (n & 0x1) {
         case 1:
             memcpy((void *)(obj + i), (void *)(ring + idx), 16);


RTE_PTR_ADD has the same effect.


-- 
David Marchand

Reply via email to