public inbox for dev@dpdk.org
 help / color / mirror / Atom feed
From: "Morten Brørup" <mb@smartsharesystems.com>
To: "Stephen Hemminger" <stephen@networkplumber.org>,
	"Konstantin Ananyev" <konstantin.ananyev@huawei.com>
Cc: <dev@dpdk.org>, "Honnappa Nagarahalli" <honnappa.nagarahalli@arm.com>
Subject: RE: [PATCH v3 1/6] test/soring: fix buffer overflow warnings with LTO
Date: Wed, 21 Jan 2026 11:40:53 +0100	[thread overview]
Message-ID: <98CBD80474FA8B44BF855DF32C47DC35F65686@smartserver.smartshare.dk> (raw)
In-Reply-To: <20260120112728.146e63b4@phoenix.local>

> From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> Sent: Tuesday, 20 January 2026 20.27
> 
> On Tue, 20 Jan 2026 15:40:21 +0000
> Konstantin Ananyev <konstantin.ananyev@huawei.com> wrote:
> 
> > > > From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> > > > Sent: Tuesday, 20 January 2026 15.34
> > > >
> > > > On Tue, 20 Jan 2026 09:49:44 +0100
> > > > Morten Brørup <mb@smartsharesystems.com> wrote:
> > > >
> > > > > > From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> > > > > > Sent: Monday, 19 January 2026 23.48
> > > > > >
> > > > > > On Fri, 16 Jan 2026 10:32:52 +0100
> > > > > > Morten Brørup <mb@smartsharesystems.com> wrote:
> > > > > >
> > > > > > > > From: Stephen Hemminger
> [mailto:stephen@networkplumber.org]
> > > > > > > > Sent: Friday, 16 January 2026 07.46
> > > > > > > >
> > > > > > > > When building with LTO (Link Time Optimization), GCC
> performs
> > > > > > > > aggressive cross-compilation-unit inlining. This causes
> the
> > > > > > compiler
> > > > > > > > to analyze all code paths in
> __rte_ring_do_dequeue_elems(),
> > > > > > including
> > > > > > > > the 16-byte element path (__rte_ring_dequeue_elems_128),
> even
> > > > when
> > > > > > > > the runtime element size is only 4 bytes.
> > > > > > > >
> > > > > > > > The static analyzer sees that the 16-byte path would copy
> > > > > > > > 32 elements * 16 bytes = 512 bytes into a 128-byte buffer
> > > > > > > > (uint32_t[32]),
> > > > > > > > triggering -Wstringop-overflow warnings.
> > > > >
> > > > > The element size is not an inline function parameter, but
> fetched
> > > > from the "esize" field in the rte_soring structure, so the
> compiler
> > > > cannot see that the element size is 4 bytes. And thus it needs to
> > > > consider all possible element sizes.
> > > > >
> > > > > > > >
> > > > > > > > The existing #pragma GCC diagnostic suppression in
> > > > > > rte_ring_elem_pvt.h
> > > > > > > > doesn't help because with LTO the warning context shifts
> to the
> > > > > > test
> > > > > > > > file where the inlined code is instantiated.
> > > > > > > >
> > > > > > > > Fix by sizing all buffers passed to soring
> acquire/dequeue
> > > > > > functions
> > > > > > > > for the worst-case element size (16 bytes = 4 *
> > > > sizeof(uint32_t)).
> > > > > > > > This satisfies the static analyzer without changing
> runtime
> > > > > > behavior.
> > > > > > >
> > > > > > > Using wildly oversized buffers doesn't seem like a
> recommendable
> > > > > > solution.
> > > > > > > If the ring library is ever updated to support cache size
> > > > elements
> > > > > > (64 byte), the buffers would have to be oversize by factor
> 16.
> > > > > >
> > > > > > The analysis (from AI) is that compiler is getting confused.
> > > > >
> > > > > That would be my analysis too.
> > > > >
> > > > > > Since there is no good
> > > > > > way other than turning of LTO for the test to tell the
> compiler
> > > > >
> > > > > There is another way to tell the compiler: __rte_assume()
> > > >
> > > > Tried that but it doesn't work because doesn't get propagated
> deep
> > > > enough to impact here.
> > >
> > > Does this fix generally imply that when using LTO, using an SORING
> with elements
> > > smaller than 16 bytes requires oversize buffers?
> > > That's not good. :-(
> > >
> > > The SORING is still experimental.
> > > Maybe the element size and metadata size need to be passed as
> parameters to
> > > the SORING functions, like the RING functions take element size as
> parameter
> > > (except the functions that are hardcoded for using pointers as
> element size).
> >
> > Personally, I am not a big fan of such idea...
> > Wonder is that possible just to disable LTO for soring.o?
> > Another thought - if all the problems come from 128 bit version of
> enque/dequeue,
> > would using memcpy() instead  of specific functions help to mitigate
> the problem?
> >
> >
> 
> A much simpler and clear solution is to just get rid of
> __rte_always_inline
> and use inline instead. The compiler still inlines a lot but it can
> make its
> own decision.
> 
> The attribute always_inline is not always faster, in fact in real world
> applications it can make things slower because real applications get i-
> cache
> misses and lots of inline expansion makes it worse.

Here's another (untested) idea...

Maybe it would help moving the inlining around.
The SORING way of inlining differs from the RING way of inlining.

In RING inlining starts at the outermost layer.

*rte_ring.h:*
static __rte_always_inline unsigned int
rte_ring_dequeue_bulk(struct rte_ring *r, void **obj_table, unsigned int n,
		unsigned int *available)
{
	return rte_ring_dequeue_bulk_elem(r, obj_table, sizeof(void *),
			n, available);

In SORING, the outermost layer is a normal function.

*rte_soring.h:*
__rte_experimental
uint32_t
rte_soring_dequeue_bulk(struct rte_soring *r, void *objs,
	uint32_t num, uint32_t *available);

*soring.c:*
RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_dequeue_bulk, 25.03)
uint32_t
rte_soring_dequeue_bulk(struct rte_soring *r, void *objs, uint32_t num,
	uint32_t *available)
{
	return soring_dequeue(r, objs, NULL, num, RTE_RING_QUEUE_FIXED,
			available);
}

Note that for RING, the element size is determined at the outermost layer and passed as a parameter to the underlying functions.

I'm not sure that modifying SORING to the same style of inlining solves anything. The element size is build time constant for RING, but SORING would have to pass r->esize as element size parameter, and that is not build time constant.
With such a change, my suggestion of adding __rte_assume(r->esize == sizeof(uint32_t)) at the application might work.
In my experience, __rte_assume() needs to be very close to the code using it, or it has no effect.

It would be an ABI change, but not an API change.


  reply	other threads:[~2026-01-21 10:41 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-23 19:41 [RFC 0/3] common/cnxk: remove dependence on VLA Stephen Hemminger
2025-10-23 19:41 ` [RFC 1/3] common/cnxk: replace variable length state array Stephen Hemminger
2025-10-23 19:41 ` [RFC 2/3] common/cnxk: replace variable length array Stephen Hemminger
2025-10-27  5:22   ` [EXTERNAL] " Harman Kalra
2025-10-23 19:41 ` [RFC 3/3] common/cnxk: re-enable vla warnings Stephen Hemminger
2026-01-14  1:49 ` [PATCH v2 0/3] common/cnxk: remove variable length arrays Stephen Hemminger
2026-01-14  1:49   ` [PATCH v2 1/3] common/cnxk: replace variable length state array Stephen Hemminger
2026-01-14  1:50   ` [PATCH v2 2/3] common/cnxk: replace variable length array Stephen Hemminger
2026-01-14  1:50   ` [PATCH v2 3/3] common/cnxk: re-enable vla warnings Stephen Hemminger
2026-01-16  6:46 ` [PATCH v3 0/6] fix GCC warnings when building with LTO Stephen Hemminger
2026-01-16  6:46   ` [PATCH v3 1/6] test/soring: fix buffer overflow warnings " Stephen Hemminger
2026-01-16  9:32     ` Morten Brørup
2026-01-19 22:48       ` Stephen Hemminger
2026-01-20  8:49         ` Morten Brørup
2026-01-20 14:34           ` Stephen Hemminger
2026-01-20 15:01             ` Morten Brørup
2026-01-20 15:40               ` Konstantin Ananyev
2026-01-20 15:48                 ` Stephen Hemminger
2026-01-20 16:52                 ` Stephen Hemminger
2026-01-20 19:27                 ` Stephen Hemminger
2026-01-21 10:40                   ` Morten Brørup [this message]
2026-01-21 12:56                   ` Konstantin Ananyev
2026-01-21 14:57                     ` Stephen Hemminger
2026-01-16  6:46   ` [PATCH v3 2/6] common/cnxk: replace variable length state array Stephen Hemminger
2026-01-16  6:46   ` [PATCH v3 3/6] common/cnxk: replace variable length array Stephen Hemminger
2026-01-16  6:46   ` [PATCH v3 4/6] common/cnxk: re-enable vla warnings Stephen Hemminger
2026-01-16  6:46   ` [PATCH v3 5/6] common/cnxk: fix buffer overflow in reassembly SA setup Stephen Hemminger
2026-01-16  6:46   ` [PATCH v3 6/6] net/mlx5/hws: fix LTO false positive stringop-overflow warning Stephen Hemminger
2026-01-19 22:44 ` [PATCH v4 0/6] fix build failures with LTO enabled Stephen Hemminger
2026-01-19 22:44   ` [PATCH v4 1/6] common/cnxk: replace variable length state array Stephen Hemminger
2026-01-19 22:44   ` [PATCH v4 2/6] common/cnxk: replace variable length array Stephen Hemminger
2026-01-19 22:44   ` [PATCH v4 3/6] common/cnxk: re-enable vla warnings Stephen Hemminger
2026-01-19 22:44   ` [PATCH v4 4/6] common/cnxk: fix buffer overflow in reassembly SA setup Stephen Hemminger
2026-01-19 22:44   ` [PATCH v4 5/6] net/mlx5: fix LTO false positive stringop-overflow warning Stephen Hemminger
2026-01-19 22:44   ` [PATCH v4 6/6] test/soring: fix stringop-overflow warning with LTO Stephen Hemminger
2026-01-20 19:52 ` [PATCH 0/6] Fix LTO compilation warnings Stephen Hemminger
2026-01-20 19:52   ` [PATCH v5 1/6] common/cnxk: replace variable length state array Stephen Hemminger
2026-01-20 19:52   ` [PATCH v5 2/6] common/cnxk: replace variable length array Stephen Hemminger
2026-01-20 19:52   ` [PATCH v5 3/6] common/cnxk: re-enable vla warnings Stephen Hemminger
2026-01-20 19:52   ` [PATCH v5 4/6] common/cnxk: fix buffer overflow in SA setup Stephen Hemminger
2026-01-20 19:52   ` [PATCH v5 5/6] net/mlx5: fix LTO stringop-overflow warning Stephen Hemminger
2026-02-05 13:43     ` Dariusz Sosnowski
2026-02-05 17:07       ` Stephen Hemminger
2026-01-20 19:52   ` [PATCH v5 6/6] ring: use inline instead of always inline in soring Stephen Hemminger
2026-01-22  9:52     ` Konstantin Ananyev
2026-01-22 10:49       ` Morten Brørup
2026-02-05 17:55   ` [PATCH v6 0/6] Fix LTO compilation warnings Stephen Hemminger
2026-02-05 17:55     ` [PATCH v6 1/6] common/cnxk: replace variable length state array Stephen Hemminger
2026-03-02 19:06       ` [EXTERNAL] " Tejasree Kondoj
2026-03-02 19:36         ` Stephen Hemminger
2026-02-05 17:55     ` [PATCH v6 2/6] common/cnxk: replace variable length array Stephen Hemminger
2026-03-02 10:51       ` [EXTERNAL] " Tejasree Kondoj
2026-02-05 17:55     ` [PATCH v6 3/6] common/cnxk: re-enable vla warnings Stephen Hemminger
2026-03-02 16:50       ` Nithin Dabilpuram
2026-02-05 17:55     ` [PATCH v6 4/6] common/cnxk: fix buffer overflow in SA setup Stephen Hemminger
2026-03-02 16:40       ` Nithin Dabilpuram
2026-02-05 17:55     ` [PATCH v6 5/6] ring: use inline instead of always inline in soring Stephen Hemminger
2026-02-05 17:55     ` [PATCH v6 6/6] net/mlx5: fix LTO stringop-overflow warning Stephen Hemminger
2026-02-06  9:51       ` Dariusz Sosnowski
2026-02-27  7:57     ` [PATCH v6 0/6] Fix LTO compilation warnings David Marchand
2026-03-03 16:24     ` David Marchand

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=98CBD80474FA8B44BF855DF32C47DC35F65686@smartserver.smartshare.dk \
    --to=mb@smartsharesystems.com \
    --cc=dev@dpdk.org \
    --cc=honnappa.nagarahalli@arm.com \
    --cc=konstantin.ananyev@huawei.com \
    --cc=stephen@networkplumber.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox