From: Konstantin Ananyev <konstantin.ananyev@huawei.com>
To: "Morten Brørup" <mb@smartsharesystems.com>,
"dev@dpdk.org" <dev@dpdk.org>
Cc: "honnappa.nagarahalli@arm.com" <honnappa.nagarahalli@arm.com>,
"jerinj@marvell.com" <jerinj@marvell.com>,
"hemant.agrawal@nxp.com" <hemant.agrawal@nxp.com>,
"drc@linux.ibm.com" <drc@linux.ibm.com>
Subject: RE: [PATCH v1 1/4] ring: introduce extra run-time checks
Date: Wed, 21 May 2025 12:34:56 +0000 [thread overview]
Message-ID: <1e3bcd254b7d4aba8fced00d76b70cee@huawei.com> (raw)
In-Reply-To: <98CBD80474FA8B44BF855DF32C47DC35E9FC7E@smartserver.smartshare.dk>
> > From: Konstantin Ananyev [mailto:konstantin.ananyev@huawei.com]
> > Sent: Wednesday, 21 May 2025 13.14
> >
> > Add RTE_ASSERT() to check that different move_tail() flavors
> > return meaningful *entries value.
> > It also helps to ensure that inside move_tail(), it uses correct
> > head/tail values.
> >
> > Signed-off-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
> > ---
> > lib/ring/rte_ring_c11_pvt.h | 2 +-
> > lib/ring/rte_ring_elem_pvt.h | 8 ++++++--
> > lib/ring/rte_ring_hts_elem_pvt.h | 8 ++++++--
> > lib/ring/rte_ring_rts_elem_pvt.h | 8 ++++++--
> > lib/ring/soring.c | 2 ++
> > 5 files changed, 21 insertions(+), 7 deletions(-)
> >
> > diff --git a/lib/ring/rte_ring_c11_pvt.h b/lib/ring/rte_ring_c11_pvt.h
> > index b9388af0da..0845cd6dcf 100644
> > --- a/lib/ring/rte_ring_c11_pvt.h
> > +++ b/lib/ring/rte_ring_c11_pvt.h
> > @@ -104,10 +104,10 @@ __rte_ring_headtail_move_head(struct
> > rte_ring_headtail *d,
> > n = (behavior == RTE_RING_QUEUE_FIXED) ?
> > 0 : *entries;
> >
> > + *new_head = *old_head + n;
> > if (n == 0)
> > return 0;
> >
> > - *new_head = *old_head + n;
> > if (is_st) {
> > d->head = *new_head;
> > success = 1;
>
> Is there a need to assign a value to *new_head if n==0?
Not really, main reason I just moved this line up - to keep compiler happy.
Otherwise it complained that *new_head might be left uninitialized.
> I don't think your suggestion is multi-thread safe.
> If d->head moves, the value in *new_head will be incorrect.
If d->head moves, then *old_head will also be incorrect.
For that case we do have CAS() below, it will return zero if (d->head != *old_head)
and we shall go to the next iteration (attempt).
Basically - if n == 0, your *old_head and *new_head might be invalid and should not be used
(and they are not used).
> Instead, suggest:
>
> - if (n == 0)
> - return 0;
>
> *new_head = *old_head + n;
> if (is_st) {
> d->head = *new_head;
> success = 1;
> } else
> /* on failure, *old_head is updated */
> success = rte_atomic_compare_exchange_strong_explicit(
> &d->head, old_head, *new_head,
> rte_memory_order_relaxed,
> rte_memory_order_relaxed);
> } while (unlikely(success == 0));
That's possible, but if (n ==0) we probably don't want to update the head -
as we are not moving head - it is pointless, while still expensive.
next prev parent reply other threads:[~2025-05-21 12:35 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-21 11:14 [PATCH v1 0/4] ring: some fixes and improvements Konstantin Ananyev
2025-05-21 11:14 ` [PATCH v1 1/4] ring: introduce extra run-time checks Konstantin Ananyev
2025-05-21 12:14 ` Morten Brørup
2025-05-21 12:34 ` Konstantin Ananyev [this message]
2025-05-21 18:36 ` Morten Brørup
2025-05-21 19:38 ` Konstantin Ananyev
2025-05-21 22:02 ` Morten Brørup
2025-05-26 8:39 ` Konstantin Ananyev
2025-05-26 9:57 ` Morten Brørup
2025-05-21 11:14 ` [PATCH v1 2/4] ring/soring: fix head-tail synchronization issue Konstantin Ananyev
2025-05-21 11:14 ` [PATCH v1 3/4] ring: fix potential sync issue between head and tail values Konstantin Ananyev
2025-05-21 20:26 ` Morten Brørup
2025-05-22 22:03 ` Wathsala Wathawana Vithanage
2025-05-26 11:54 ` Konstantin Ananyev
2025-05-27 21:33 ` Wathsala Wathawana Vithanage
2025-05-27 22:47 ` Wathsala Wathawana Vithanage
2025-06-02 11:11 ` Konstantin Ananyev
2025-06-04 3:47 ` Wathsala Wathawana Vithanage
2025-06-04 17:20 ` Wathsala Wathawana Vithanage
2025-06-12 11:39 ` Konstantin Ananyev
2025-05-21 11:14 ` [PATCH v1 4/4] config/x86: enable RTE_USE_C11_MEM_MODEL by default Konstantin Ananyev
2025-05-21 19:47 ` Morten Brørup
2026-01-14 19:42 ` [PATCH v1 0/4] ring: some fixes and improvements Stephen Hemminger
2026-01-23 5:01 ` Stephen Hemminger
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=1e3bcd254b7d4aba8fced00d76b70cee@huawei.com \
--to=konstantin.ananyev@huawei.com \
--cc=dev@dpdk.org \
--cc=drc@linux.ibm.com \
--cc=hemant.agrawal@nxp.com \
--cc=honnappa.nagarahalli@arm.com \
--cc=jerinj@marvell.com \
--cc=mb@smartsharesystems.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.